﻿var FCK_STATUS_NOTLOADED = window.parent.FCK_STATUS_NOTLOADED = 0;
var FCK_STATUS_ACTIVE = window.parent.FCK_STATUS_ACTIVE = 1;
var FCK_STATUS_COMPLETE = window.parent.FCK_STATUS_COMPLETE = 2;
var FCK_TRISTATE_OFF = window.parent.FCK_TRISTATE_OFF = 0;
var FCK_TRISTATE_ON = window.parent.FCK_TRISTATE_ON = 1;
var FCK_TRISTATE_DISABLED = window.parent.FCK_TRISTATE_DISABLED = -1;
var FCK_UNKNOWN = window.parent.FCK_UNKNOWN = -9;
var FCK_TOOLBARITEM_ONLYICON = window.parent.FCK_TOOLBARITEM_ONLYICON = 0;
var FCK_TOOLBARITEM_ONLYTEXT = window.parent.FCK_TOOLBARITEM_ONLYTEXT = 1;
var FCK_TOOLBARITEM_ICONTEXT = window.parent.FCK_TOOLBARITEM_ICONTEXT = 2;
var FCK_EDITMODE_WYSIWYG = window.parent.FCK_EDITMODE_WYSIWYG = 0;
var FCK_EDITMODE_SOURCE = window.parent.FCK_EDITMODE_SOURCE = 1;
var FCK_IMAGES_PATH = 'images/';
var FCK_SPACER_PATH = 'images/spacer.gif';
var CTRL = 1000;
var SHIFT = 2000;
var ALT = 4000;
var FCK_STYLE_BLOCK = 0;
var FCK_STYLE_INLINE = 1;
var FCK_STYLE_OBJECT = 2;
String.prototype.Contains = function (A)
{
        return (this.indexOf(A) > -1);
};
String.prototype.Equals = function ()
{
        var A = arguments;
        if (A.length == 1 && A[0].pop) A = A[0];
        for (var i = 0; i < A.length; i++)
        {
                if (this == A[i]) return true;
        };
        return false;
};
String.prototype.IEquals = function ()
{
        var A = this.toUpperCase();
        var B = arguments;
        if (B.length == 1 && B[0].pop) B = B[0];
        for (var i = 0; i < B.length; i++)
        {
                if (A == B[i].toUpperCase()) return true;
        };
        return false;
};
String.prototype.ReplaceAll = function (A, B)
{
        var C = this;
        for (var i = 0; i < A.length; i++)
        {
                C = C.replace(A[i], B[i]);
        };
        return C;
};
String.prototype.StartsWith = function (A)
{
        return (this.substr(0, A.length) == A);
};
String.prototype.EndsWith = function (A, B)
{
        var C = this.length;
        var D = A.length;
        if (D > C) return false;
        if (B)
        {
                var E = new RegExp(A + '$', 'i');
                return E.test(this);
        }
        else return (D == 0 || this.substr(C - D, D) == A);
};
String.prototype.Remove = function (A, B)
{
        var s = '';
        if (A > 0) s = this.substring(0, A);
        if (A + B < this.length) s += this.substring(A + B, this.length);
        return s;
};
String.prototype.Trim = function ()
{
        return this.replace(/(^[ \t\n\r]*)|([ \t\n\r]*$)/g, '');
};
String.prototype.LTrim = function ()
{
        return this.replace(/^[ \t\n\r]*/g, '');
};
String.prototype.RTrim = function ()
{
        return this.replace(/[ \t\n\r]*$/g, '');
};
String.prototype.ReplaceNewLineChars = function (A)
{
        return this.replace(/\n/g, A);
};
String.prototype.Replace = function (A, B, C)
{
        if (typeof B == 'function')
        {
                return this.replace(A, function ()
                {
                        return B.apply(C || this, arguments);
                });
        }
        else return this.replace(A, B);
};
Array.prototype.IndexOf = function (A)
{
        for (var i = 0; i < this.length; i++)
        {
                if (this[i] == A) return i;
        };
        return -1;
};
var FCKIECleanup = function (A)
        {
                if (A._FCKCleanupObj) this.Items = A._FCKCleanupObj.Items;
                else
                {
                        this.Items = [];
                        A._FCKCleanupObj = this;
                        FCKTools.AddEventListenerEx(A, 'unload', FCKIECleanup_Cleanup);
                }
        };
FCKIECleanup.prototype.AddItem = function (A, B)
{
        this.Items.push([A, B]);
};

function FCKIECleanup_Cleanup()
{
        if (!this._FCKCleanupObj || (FCKConfig.MsWebBrowserControlCompat && !window.FCKUnloadFlag)) return;
        var A = this._FCKCleanupObj.Items;
        while (A.length > 0)
        {
                var B = A.pop();
                if (B) B[1].call(B[0]);
        };
        this._FCKCleanupObj = null;
        if (CollectGarbage) CollectGarbage();
};
var s = navigator.userAgent.toLowerCase();
var FCKBrowserInfo = {
        IsIE: /*@cc_on!@*/
        false,
        IsIE7: /*@cc_on!@*/
        false && (parseInt(s.match(/msie (\d+)/)[1], 10) >= 7),
        IsIE6: /*@cc_on!@*/
        false && (parseInt(s.match(/msie (\d+)/)[1], 10) >= 6),
        IsSafari: s.Contains(' applewebkit/'),
        IsOpera: !! window.opera,
        IsAIR: s.Contains(' adobeair/'),
        IsMac: s.Contains('macintosh')
};
(function (A)
{
        A.IsGecko = (navigator.product == 'Gecko') && !A.IsSafari && !A.IsOpera;
        A.IsGeckoLike = (A.IsGecko || A.IsSafari || A.IsOpera);
        if (A.IsGecko)
        {
                var B = s.match(/rv:(\d+\.\d+)/);
                var C = B && parseFloat(B[1]);
                if (C)
                {
                        A.IsGecko10 = (C < 1.8);
                        A.IsGecko19 = (C > 1.8);
                }
        };
        if (A.IsSafari) A.IsSafari3 = (parseFloat(s.match(/ applewebkit\/(\d+)/)[1]) < 526);
})(FCKBrowserInfo);
var FCKURLParams = {};
(function ()
{
        var A = document.location.search.substr(1).split('&');
        for (var i = 0; i < A.length; i++)
        {
                var B = A[i].split('=');
                var C = decodeURIComponent(B[0]);
                var D = decodeURIComponent(B[1]);
                FCKURLParams[C] = D;
        }
})();
var FCKEvents = function (A)
        {
                this.Owner = A;
                this._RegisteredEvents = {};
        };
FCKEvents.prototype.AttachEvent = function (A, B)
{
        var C;
        if (!(C = this._RegisteredEvents[A])) this._RegisteredEvents[A] = [B];
        else
        {
                if (C.IndexOf(B) == -1) C.push(B);
        }
};
FCKEvents.prototype.FireEvent = function (A, B)
{
        var C = true;
        var D = this._RegisteredEvents[A];
        if (D)
        {
                for (var i = 0; i < D.length; i++)
                {
                        try
                        {
                                C = (D[i](this.Owner, B) && C);
                        }
                        catch (e)
                        {
                                if (e.number != -2146823277) throw e;
                        }
                }
        };
        return C;
};
var FCKDataProcessor = function ()
        {};
FCKDataProcessor.prototype = {
        ConvertToHtml: function (A)
        {
                if (FCKConfig.FullPage)
                {
                        FCK.DocTypeDeclaration = A.match(FCKRegexLib.DocTypeTag);
                        if (!FCKRegexLib.HasBodyTag.test(A)) A = '<body>' + A + '</body>';
                        if (!FCKRegexLib.HtmlOpener.test(A)) A = '<html dir="' + FCKConfig.ContentLangDirection + '">' + A + '</html>';
                        if (!FCKRegexLib.HeadOpener.test(A)) A = A.replace(FCKRegexLib.HtmlOpener, '$&<head><title></title></head>');
                        return A;
                }
                else
                {
                        var B = FCKConfig.DocType + '<html dir="' + FCKConfig.ContentLangDirection + '"';
                        if (FCKBrowserInfo.IsIE && FCKConfig.DocType.length > 0 && !FCKRegexLib.Html4DocType.test(FCKConfig.DocType)) B += ' style="overflow-y: scroll"';
                        B += '><head><title></title></head><body' + FCKConfig.GetBodyAttributes() + '>' + A + '</body></html>';
                        return B;
                }
        },
        ConvertToDataFormat: function (A, B, C, D)
        {
                var E = FCKXHtml.GetXHTML(A, !B, D);
                if (C && FCKRegexLib.EmptyOutParagraph.test(E)) return '';
                return E;
        },
        FixHtml: function (A)
        {
                return A;
        }
};
var FCK = {
        Name: FCKURLParams['InstanceName'],
        Status: 0,
        EditMode: 0,
        Toolbar: null,
        HasFocus: false,
        DataProcessor: new FCKDataProcessor(),
        GetInstanceObject: (function ()
        {
                var w = window;
                return function (name)
                {
                        return w[name];
                }
        })(),
        AttachToOnSelectionChange: function (A)
        {
                this.Events.AttachEvent('OnSelectionChange', A);
        },
        GetLinkedFieldValue: function ()
        {
                return this.LinkedField.value;
        },
        GetParentForm: function ()
        {
                return this.LinkedField.form;
        },
        StartupValue: '',
        IsDirty: function ()
        {
                if (this.EditMode == 1) return (this.StartupValue != this.EditingArea.Textarea.value);
                else
                {
                        if (!this.EditorDocument) return false;
                        return (this.StartupValue != this.EditorDocument.body.innerHTML);
                }
        },
        ResetIsDirty: function ()
        {
                if (this.EditMode == 1) this.StartupValue = this.EditingArea.Textarea.value;
                else if (this.EditorDocument.body) this.StartupValue = this.EditorDocument.body.innerHTML;
        },
        StartEditor: function ()
        {
                this.TempBaseTag = FCKConfig.BaseHref.length > 0 ? '<base href="' + FCKConfig.BaseHref + '" _fcktemp="true"></base>' : '';
                var A = FCK.KeystrokeHandler = new FCKKeystrokeHandler();
                A.OnKeystroke = _FCK_KeystrokeHandler_OnKeystroke;
                A.SetKeystrokes(FCKConfig.Keystrokes);
                if (FCKBrowserInfo.IsIE7)
                {
                        if ((CTRL + 86) in A.Keystrokes) A.SetKeystrokes([CTRL + 86, true]);
                        if ((SHIFT + 45) in A.Keystrokes) A.SetKeystrokes([SHIFT + 45, true]);
                };
                A.SetKeystrokes([CTRL + 8, true]);
                this.EditingArea = new FCKEditingArea(document.getElementById('xEditingArea'));
                this.EditingArea.FFSpellChecker = FCKConfig.FirefoxSpellChecker;
                this.SetData(this.GetLinkedFieldValue(), true);
                FCKTools.AddEventListener(document, "keydown", this._TabKeyHandler);
                this.AttachToOnSelectionChange(_FCK_PaddingNodeListener);
                if (FCKBrowserInfo.IsGecko) this.AttachToOnSelectionChange(this._ExecCheckEmptyBlock);
        },
        Focus: function ()
        {
                FCK.EditingArea.Focus();
        },
        SetStatus: function (A)
        {
                this.Status = A;
                if (A == 1)
                {
                        FCKFocusManager.AddWindow(window, true);
                        if (FCKBrowserInfo.IsIE) FCKFocusManager.AddWindow(window.frameElement, true);
                        if (FCKConfig.StartupFocus) FCK.Focus();
                };
                this.Events.FireEvent('OnStatusChange', A);
        },
        FixBody: function ()
        {
                var A = FCKConfig.EnterMode;
                if (A != 'p' && A != 'div') return;
                var B = this.EditorDocument;
                if (!B) return;
                var C = B.body;
                if (!C) return;
                FCKDomTools.TrimNode(C);
                var D = C.firstChild;
                var E;
                while (D)
                {
                        var F = false;
                        switch (D.nodeType)
                        {
                        case 1:
                                var G = D.nodeName.toLowerCase();
                                if (!FCKListsLib.BlockElements[G] && G != 'li' && !D.getAttribute('_fckfakelement') && D.getAttribute('_moz_dirty') == null) F = true;
                                break;
                        case 3:
                                if (E || D.nodeValue.Trim().length > 0) F = true;
                                break;
                        case 8:
                                if (E) F = true;
                                break;
                        };
                        if (F)
                        {
                                var H = D.parentNode;
                                if (!E) E = H.insertBefore(B.createElement(A), D);
                                E.appendChild(H.removeChild(D));
                                D = E.nextSibling;
                        }
                        else
                        {
                                if (E)
                                {
                                        FCKDomTools.TrimNode(E);
                                        E = null;
                                };
                                D = D.nextSibling;
                        }
                };
                if (E) FCKDomTools.TrimNode(E);
        },
        GetData: function (A)
        {
                FCK.Events.FireEvent("OnBeforeGetData");
                if (FCK.EditMode == 1) return FCK.EditingArea.Textarea.value;
                this.FixBody();
                var B = FCK.EditorDocument;
                if (!B) return null;
                var C = FCKConfig.FullPage;
                var D = FCK.DataProcessor.ConvertToDataFormat(C ? B.documentElement : B.body, !C, FCKConfig.IgnoreEmptyParagraphValue, A);
                D = FCK.ProtectEventsRestore(D);
                if (FCKBrowserInfo.IsIE) D = D.replace(FCKRegexLib.ToReplace, '$1');
                if (C)
                {
                        if (FCK.DocTypeDeclaration && FCK.DocTypeDeclaration.length > 0) D = FCK.DocTypeDeclaration + '\n' + D;
                        if (FCK.XmlDeclaration && FCK.XmlDeclaration.length > 0) D = FCK.XmlDeclaration + '\n' + D;
                };
                D = FCKConfig.ProtectedSource.Revert(D);
                setTimeout(function ()
                {
                        FCK.Events.FireEvent("OnAfterGetData");
                }, 0);
                return D;
        },
        UpdateLinkedField: function ()
        {
                var A = FCK.GetXHTML(FCKConfig.FormatOutput);
                if (FCKConfig.HtmlEncodeOutput) A = FCKTools.HTMLEncode(A);
                FCK.LinkedField.value = A;
                FCK.Events.FireEvent('OnAfterLinkedFieldUpdate');
        },
        RegisteredDoubleClickHandlers: {},
        OnDoubleClick: function (A)
        {
                var B = FCK.RegisteredDoubleClickHandlers[A.tagName.toUpperCase()];
                if (B)
                {
                        for (var i = 0; i < B.length; i++) B[i](A);
                };
                B = FCK.RegisteredDoubleClickHandlers['*'];
                if (B)
                {
                        for (var i = 0; i < B.length; i++) B[i](A);
                }
        },
        RegisterDoubleClickHandler: function (A, B)
        {
                var C = B || '*';
                C = C.toUpperCase();
                var D;
                if (!(D = FCK.RegisteredDoubleClickHandlers[C])) FCK.RegisteredDoubleClickHandlers[C] = [A];
                else
                {
                        if (D.IndexOf(A) == -1) D.push(A);
                }
        },
        OnAfterSetHTML: function ()
        {
                FCKDocumentProcessor.Process(FCK.EditorDocument);
                FCKUndo.SaveUndoStep();
                FCK.Events.FireEvent('OnSelectionChange');
                FCK.Events.FireEvent('OnAfterSetHTML');
        },
        ProtectUrls: function (A)
        {
                A = A.replace(FCKRegexLib.ProtectUrlsA, '$& _fcksavedurl=$1');
                A = A.replace(FCKRegexLib.ProtectUrlsImg, '$& _fcksavedurl=$1');
                A = A.replace(FCKRegexLib.ProtectUrlsArea, '$& _fcksavedurl=$1');
                return A;
        },
        ProtectEvents: function (A)
        {
                return A.replace(FCKRegexLib.TagsWithEvent, _FCK_ProtectEvents_ReplaceTags);
        },
        ProtectEventsRestore: function (A)
        {
                return A.replace(FCKRegexLib.ProtectedEvents, _FCK_ProtectEvents_RestoreEvents);
        },
        ProtectTags: function (A)
        {
                var B = FCKConfig.ProtectedTags;
                if (FCKBrowserInfo.IsIE) B += B.length > 0 ? '|ABBR|XML|EMBED|OBJECT' : 'ABBR|XML|EMBED|OBJECT';
                var C;
                if (B.length > 0)
                {
                        C = new RegExp('<(' + B + ')(?!\w|:)', 'gi');
                        A = A.replace(C, '<FCK:$1');
                        C = new RegExp('<\/(' + B + ')>', 'gi');
                        A = A.replace(C, '<\/FCK:$1>');
                };
                B = 'META';
                if (FCKBrowserInfo.IsIE) B += '|HR';
                C = new RegExp('<((' + B + ')(?=\\s|>|/)[\\s\\S]*?)/?>', 'gi');
                A = A.replace(C, '<FCK:$1 />');
                return A;
        },
        SetData: function (A, B)
        {
                this.EditingArea.Mode = FCK.EditMode;
                if (FCKBrowserInfo.IsIE && FCK.EditorDocument)
                {
                        FCK.EditorDocument.detachEvent("onselectionchange", Doc_OnSelectionChange);
                };
                FCKTempBin.Reset();
                FCK.Selection.Release();
                if (FCK.EditMode == 0)
                {
                        this._ForceResetIsDirty = (B === true);
                        A = FCKConfig.ProtectedSource.Protect(A);
                        A = FCK.DataProcessor.ConvertToHtml(A);
                        A = A.replace(FCKRegexLib.InvalidSelfCloseTags, '$1></$2>');
                        A = FCK.ProtectEvents(A);
                        A = FCK.ProtectUrls(A);
                        A = FCK.ProtectTags(A);
                        if (FCK.TempBaseTag.length > 0 && !FCKRegexLib.HasBaseTag.test(A)) A = A.replace(FCKRegexLib.HeadOpener, '$&' + FCK.TempBaseTag);
                        var C = '';
                        if (!FCKConfig.FullPage) C += _FCK_GetEditorAreaStyleTags();
                        if (FCKBrowserInfo.IsIE) C += FCK._GetBehaviorsStyle();
                        else if (FCKConfig.ShowBorders) C += FCKTools.GetStyleHtml(FCK_ShowTableBordersCSS, true);
                        C += FCKTools.GetStyleHtml(FCK_InternalCSS, true);
                        A = A.replace(FCKRegexLib.HeadCloser, C + '$&');
                        this.EditingArea.OnLoad = _FCK_EditingArea_OnLoad;
                        this.EditingArea.Start(A);
                }
                else
                {
                        FCK.EditorWindow = null;
                        FCK.EditorDocument = null;
                        FCKDomTools.PaddingNode = null;
                        this.EditingArea.OnLoad = null;
                        this.EditingArea.Start(A);
                        this.EditingArea.Textarea._FCKShowContextMenu = true;
                        FCK.EnterKeyHandler = null;
                        if (B) this.ResetIsDirty();
                        FCK.KeystrokeHandler.AttachToElement(this.EditingArea.Textarea);
                        this.EditingArea.Textarea.focus();
                        FCK.Events.FireEvent('OnAfterSetHTML');
                };
                if (window.onresize) window.onresize();
        },
        RedirectNamedCommands: {},
        ExecuteNamedCommand: function (A, B, C, D)
        {
                if (!D) FCKUndo.SaveUndoStep();
                if (!C && FCK.RedirectNamedCommands[A] != null) FCK.ExecuteRedirectedNamedCommand(A, B);
                else
                {
                        FCK.Focus();
                        FCK.EditorDocument.execCommand(A, false, B);
                        FCK.Events.FireEvent('OnSelectionChange');
                };
                if (!D) FCKUndo.SaveUndoStep();
        },
        GetNamedCommandState: function (A)
        {
                try
                {
                        if (FCKBrowserInfo.IsSafari && FCK.EditorWindow && A.IEquals('Paste')) return 0;
                        if (!FCK.EditorDocument.queryCommandEnabled(A)) return -1;
                        else
                        {
                                return FCK.EditorDocument.queryCommandState(A) ? 1 : 0;
                        }
                }
                catch (e)
                {
                        return 0;
                }
        },
        GetNamedCommandValue: function (A)
        {
                var B = '';
                var C = FCK.GetNamedCommandState(A);
                if (C == -1) return null;
                try
                {
                        B = this.EditorDocument.queryCommandValue(A);
                }
                catch (e)
                {};
                return B ? B : '';
        },
        Paste: function (A)
        {
                if (FCK.Status != 2 || !FCK.Events.FireEvent('OnPaste')) return false;
                return A || FCK._ExecPaste();
        },
        PasteFromWord: function ()
        {
                FCKDialog.OpenDialog('FCKDialog_Paste', FCKLang.PasteFromWord, 'dialog/fck_paste.html', 400, 330, 'Word');
        },
        Preview: function ()
        {
                var A;
                if (FCKConfig.FullPage)
                {
                        if (FCK.TempBaseTag.length > 0) A = FCK.TempBaseTag + FCK.GetXHTML();
                        else A = FCK.GetXHTML();
                }
                else
                {
                        A = FCKConfig.DocType + '<html dir="' + FCKConfig.ContentLangDirection + '"><head>' + FCK.TempBaseTag + '<title>' + FCKLang.Preview + '</title>' + _FCK_GetEditorAreaStyleTags() + '</head><body' + FCKConfig.GetBodyAttributes() + '>' + FCK.GetXHTML() + '</body></html>';
                };
                var B = FCKConfig.ScreenWidth * 0.8;
                var C = FCKConfig.ScreenHeight * 0.7;
                var D = (FCKConfig.ScreenWidth - B) / 2;
                var E = '';
                if (FCK_IS_CUSTOM_DOMAIN && FCKBrowserInfo.IsIE)
                {
                        window._FCKHtmlToLoad = A;
                        E = 'javascript:void( (function(){document.open() ;document.domain="' + document.domain + '" ;document.write( window.opener._FCKHtmlToLoad );document.close() ;window.opener._FCKHtmlToLoad = null ;})() )';
                };
                var F = window.open(E, null, 'toolbar=yes,location=no,status=yes,menubar=yes,scrollbars=yes,resizable=yes,width=' + B + ',height=' + C + ',left=' + D);
                if (!FCK_IS_CUSTOM_DOMAIN || !FCKBrowserInfo.IsIE)
                {
                        F.document.write(A);
                        F.document.close();
                }
        },
        SwitchEditMode: function (A)
        {
                var B = (FCK.EditMode == 0);
                var C = FCK.IsDirty();
                var D;
                if (B)
                {
                        FCKCommands.GetCommand('ShowBlocks').SaveState();
                        if (!A && FCKBrowserInfo.IsIE) FCKUndo.SaveUndoStep();
                        D = FCK.GetXHTML(FCKConfig.FormatSource);
                        if (FCKBrowserInfo.IsIE) FCKTempBin.ToHtml();
                        if (D == null) return false;
                }
                else D = this.EditingArea.Textarea.value;
                FCK.EditMode = B ? 1 : 0;
                FCK.SetData(D, !C);
                FCK.Focus();
                FCKTools.RunFunction(FCK.ToolbarSet.RefreshModeState, FCK.ToolbarSet);
                return true;
        },
        InsertElement: function (A)
        {
                if (typeof A == 'string') A = this.EditorDocument.createElement(A);
                var B = A.nodeName.toLowerCase();
                FCKSelection.Restore();
                var C = new FCKDomRange(this.EditorWindow);
                C.MoveToSelection();
                C.DeleteContents();
                if (FCKListsLib.BlockElements[B] != null)
                {
                        if (C.StartBlock)
                        {
                                if (C.CheckStartOfBlock()) C.MoveToPosition(C.StartBlock, 3);
                                else if (C.CheckEndOfBlock()) C.MoveToPosition(C.StartBlock, 4);
                                else C.SplitBlock();
                        };
                        C.InsertNode(A);
                        var D = FCKDomTools.GetNextSourceElement(A, false, null, ['hr', 'br', 'param', 'img', 'area', 'input'], true);
                        if (!D && FCKConfig.EnterMode != 'br')
                        {
                                D = this.EditorDocument.body.appendChild(this.EditorDocument.createElement(FCKConfig.EnterMode));
                                if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(D);
                        };
                        if (FCKListsLib.EmptyElements[B] == null) C.MoveToElementEditStart(A);
                        else if (D) C.MoveToElementEditStart(D);
                        else C.MoveToPosition(A, 4);
                        if (FCKBrowserInfo.IsGeckoLike)
                        {
                                if (D) FCKDomTools.ScrollIntoView(D, false);
                                FCKDomTools.ScrollIntoView(A, false);
                        }
                }
                else
                {
                        C.InsertNode(A);
                        C.SetStart(A, 4);
                        C.SetEnd(A, 4);
                };
                C.Select();
                C.Release();
                this.Focus();
                return A;
        },
        _InsertBlockElement: function (A)
        {},
        _IsFunctionKey: function (A)
        {
                if (A >= 16 && A <= 20) return true;
                if (A == 27 || (A >= 33 && A <= 40)) return true;
                if (A == 45) return true;
                return false;
        },
        _KeyDownListener: function (A)
        {
                if (!A) A = FCK.EditorWindow.event;
                if (FCK.EditorWindow)
                {
                        if (!FCK._IsFunctionKey(A.keyCode) && !(A.ctrlKey || A.metaKey) && !(A.keyCode == 46)) FCK._KeyDownUndo();
                };
                return true;
        },
        _KeyDownUndo: function ()
        {
                if (!FCKUndo.Typing)
                {
                        FCKUndo.SaveUndoStep();
                        FCKUndo.Typing = true;
                        FCK.Events.FireEvent("OnSelectionChange");
                };
                FCKUndo.TypesCount++;
                FCKUndo.Changed = 1;
                if (FCKUndo.TypesCount > FCKUndo.MaxTypes)
                {
                        FCKUndo.TypesCount = 0;
                        FCKUndo.SaveUndoStep();
                }
        },
        _TabKeyHandler: function (A)
        {
                if (!A) A = window.event;
                var B = A.keyCode;
                if (B == 9 && FCK.EditMode != 0)
                {
                        if (FCKBrowserInfo.IsIE)
                        {
                                var C = document.selection.createRange();
                                if (C.parentElement() != FCK.EditingArea.Textarea) return true;
                                C.text = '\t';
                                C.select();
                        }
                        else
                        {
                                var a = [];
                                var D = FCK.EditingArea.Textarea;
                                var E = D.selectionStart;
                                var F = D.selectionEnd;
                                a.push(D.value.substr(0, E));
                                a.push('\t');
                                a.push(D.value.substr(F));
                                D.value = a.join('');
                                D.setSelectionRange(E + 1, E + 1);
                        };
                        if (A.preventDefault) return A.preventDefault();
                        return A.returnValue = false;
                };
                return true;
        }
};
FCK.Events = new FCKEvents(FCK);
FCK.GetHTML = FCK.GetXHTML = FCK.GetData;
FCK.SetHTML = FCK.SetData;
FCK.InsertElementAndGetIt = FCK.CreateElement = FCK.InsertElement;

function _FCK_ProtectEvents_ReplaceTags(A)
{
        return A.replace(FCKRegexLib.EventAttributes, _FCK_ProtectEvents_ReplaceEvents);
};

function _FCK_ProtectEvents_ReplaceEvents(A, B)
{
        return ' ' + B + '_fckprotectedatt="' + encodeURIComponent(A) + '"';
};

function _FCK_ProtectEvents_RestoreEvents(A, B)
{
        return decodeURIComponent(B);
};

function _FCK_MouseEventsListener(A)
{
        if (!A) A = window.event;
        if (A.type == 'mousedown') FCK.MouseDownFlag = true;
        else if (A.type == 'mouseup') FCK.MouseDownFlag = false;
        else if (A.type == 'mousemove') FCK.Events.FireEvent('OnMouseMove', A);
};

function _FCK_PaddingNodeListener()
{
        if (FCKConfig.EnterMode.IEquals('br')) return;
        FCKDomTools.EnforcePaddingNode(FCK.EditorDocument, FCKConfig.EnterMode);
        if (!FCKBrowserInfo.IsIE && FCKDomTools.PaddingNode)
        {
                var A = FCKSelection.GetSelection();
                if (A && A.rangeCount == 1)
                {
                        var B = A.getRangeAt(0);
                        if (B.collapsed && B.startContainer == FCK.EditorDocument.body && B.startOffset == 0)
                        {
                                B.selectNodeContents(FCKDomTools.PaddingNode);
                                B.collapse(true);
                                A.removeAllRanges();
                                A.addRange(B);
                        }
                }
        }
        else if (FCKDomTools.PaddingNode)
        {
                var C = FCKSelection.GetParentElement();
                var D = FCKDomTools.PaddingNode;
                if (C && C.nodeName.IEquals('body'))
                {
                        if (FCK.EditorDocument.body.childNodes.length == 1 && FCK.EditorDocument.body.firstChild == D)
                        {
                                if (FCKSelection._GetSelectionDocument(FCK.EditorDocument.selection) != FCK.EditorDocument) return;
                                var B = FCK.EditorDocument.body.createTextRange();
                                var F = false;
                                if (!D.childNodes.firstChild)
                                {
                                        D.appendChild(FCKTools.GetElementDocument(D).createTextNode('\ufeff'));
                                        F = true;
                                };
                                B.moveToElementText(D);
                                B.select();
                                if (F) B.pasteHTML('');
                        }
                }
        }
};

function _FCK_EditingArea_OnLoad()
{
        FCK.EditorWindow = FCK.EditingArea.Window;
        FCK.EditorDocument = FCK.EditingArea.Document;
        if (FCKBrowserInfo.IsIE) FCKTempBin.ToElements();
        FCK.InitializeBehaviors();
        FCK.MouseDownFlag = false;
        FCKTools.AddEventListener(FCK.EditorDocument, 'mousemove', _FCK_MouseEventsListener);
        FCKTools.AddEventListener(FCK.EditorDocument, 'mousedown', _FCK_MouseEventsListener);
        FCKTools.AddEventListener(FCK.EditorDocument, 'mouseup', _FCK_MouseEventsListener);
        if (FCKBrowserInfo.IsSafari)
        {
                FCKTools.AddEventListener(FCK.EditorDocument, 'paste', function (evt)
                {
                        var A = new FCKDomRange(FCK.EditorWindow);
                        var B = FCK.EditorDocument.createTextNode('\ufeff');
                        var C = FCK.EditorDocument.createElement('a');
                        C.id = 'fck_paste_padding';
                        C.innerHTML = '&#65279;';
                        A.MoveToSelection();
                        A.DeleteContents();
                        A.InsertNode(B);
                        A.Collapse();
                        A.InsertNode(C);
                        A.MoveToPosition(C, 3);
                        A.Select();
                        setTimeout(function ()
                        {
                                B.parentNode.removeChild(B);
                                C = FCK.EditorDocument.getElementById('fck_paste_padding');
                                C.parentNode.removeChild(C);
                        }, 0);
                });
        };
        if (FCKBrowserInfo.IsSafari)
        {
                var D = function (evt)
                        {
                                if (!(evt.ctrlKey || evt.metaKey)) return;
                                if (FCK.EditMode != 0) return;
                                switch (evt.keyCode)
                                {
                                case 89:
                                        FCKUndo.Redo();
                                        break;
                                case 90:
                                        FCKUndo.Undo();
                                        break;
                                }
                        };
                FCKTools.AddEventListener(FCK.EditorDocument, 'keyup', D);
        };
        FCK.EnterKeyHandler = new FCKEnterKey(FCK.EditorWindow, FCKConfig.EnterMode, FCKConfig.ShiftEnterMode, FCKConfig.TabSpaces);
        FCK.KeystrokeHandler.AttachToElement(FCK.EditorDocument);
        if (FCK._ForceResetIsDirty) FCK.ResetIsDirty();
        if (FCKBrowserInfo.IsIE && FCK.HasFocus) FCK.EditorDocument.body.setActive();
        FCK.OnAfterSetHTML();
        FCKCommands.GetCommand('ShowBlocks').RestoreState();
        if (FCK.Status != 0) return;
        FCK.SetStatus(1);
};

function _FCK_GetEditorAreaStyleTags()
{
        return FCKTools.GetStyleHtml(FCKConfig.EditorAreaCSS) + FCKTools.GetStyleHtml(FCKConfig.EditorAreaStyles);
};

function _FCK_KeystrokeHandler_OnKeystroke(A, B)
{
        if (FCK.Status != 2) return false;
        if (FCK.EditMode == 0)
        {
                switch (B)
                {
                case 'Paste':
                        return !FCK.Paste();
                case 'Cut':
                        FCKUndo.SaveUndoStep();
                        return false;
                }
        }
        else
        {
                if (B.Equals('Paste', 'Undo', 'Redo', 'SelectAll', 'Cut')) return false;
        };
        var C = FCK.Commands.GetCommand(B);
        if (C.GetState() == -1) return false;
        return (C.Execute.apply(C, FCKTools.ArgumentsToArray(arguments, 2)) !== false);
};
(function ()
{
        var A = window.parent.document;
        var B = A.getElementById(FCK.Name);
        var i = 0;
        while (B || i == 0)
        {
                if (B && B.tagName.toLowerCase().Equals('input', 'textarea'))
                {
                        FCK.LinkedField = B;
                        break;
                };
                B = A.getElementsByName(FCK.Name)[i++];
        }
})();
var FCKTempBin = {
        Elements: [],
        AddElement: function (A)
        {
                var B = this.Elements.length;
                this.Elements[B] = A;
                return B;
        },
        RemoveElement: function (A)
        {
                var e = this.Elements[A];
                this.Elements[A] = null;
                return e;
        },
        Reset: function ()
        {
                var i = 0;
                while (i < this.Elements.length) this.Elements[i++] = null;
                this.Elements.length = 0;
        },
        ToHtml: function ()
        {
                for (var i = 0; i < this.Elements.length; i++)
                {
                        this.Elements[i] = '<div>&nbsp;' + this.Elements[i].outerHTML + '</div>';
                        this.Elements[i].isHtml = true;
                }
        },
        ToElements: function ()
        {
                var A = FCK.EditorDocument.createElement('div');
                for (var i = 0; i < this.Elements.length; i++)
                {
                        if (this.Elements[i].isHtml)
                        {
                                A.innerHTML = this.Elements[i];
                                this.Elements[i] = A.firstChild.removeChild(A.firstChild.lastChild);
                        }
                }
        }
};
var FCKFocusManager = FCK.FocusManager = {
        IsLocked: false,
        AddWindow: function (A, B)
        {
                var C;
                if (FCKBrowserInfo.IsIE) C = A.nodeType == 1 ? A : A.frameElement ? A.frameElement : A.document;
                else if (FCKBrowserInfo.IsSafari) C = A;
                else C = A.document;
                FCKTools.AddEventListener(C, 'blur', FCKFocusManager_Win_OnBlur);
                FCKTools.AddEventListener(C, 'focus', B ? FCKFocusManager_Win_OnFocus_Area : FCKFocusManager_Win_OnFocus);
        },
        RemoveWindow: function (A)
        {
                if (FCKBrowserInfo.IsIE) oTarget = A.nodeType == 1 ? A : A.frameElement ? A.frameElement : A.document;
                else oTarget = A.document;
                FCKTools.RemoveEventListener(oTarget, 'blur', FCKFocusManager_Win_OnBlur);
                FCKTools.RemoveEventListener(oTarget, 'focus', FCKFocusManager_Win_OnFocus_Area);
                FCKTools.RemoveEventListener(oTarget, 'focus', FCKFocusManager_Win_OnFocus);
        },
        Lock: function ()
        {
                this.IsLocked = true;
        },
        Unlock: function ()
        {
                if (this._HasPendingBlur) FCKFocusManager._Timer = window.setTimeout(FCKFocusManager_FireOnBlur, 100);
                this.IsLocked = false;
        },
        _ResetTimer: function ()
        {
                this._HasPendingBlur = false;
                if (this._Timer)
                {
                        window.clearTimeout(this._Timer);
                        delete this._Timer;
                }
        }
};

function FCKFocusManager_Win_OnBlur()
{
        if (typeof (FCK) != 'undefined' && FCK.HasFocus)
        {
                FCKFocusManager._ResetTimer();
                FCKFocusManager._Timer = window.setTimeout(FCKFocusManager_FireOnBlur, 100);
        }
};

function FCKFocusManager_FireOnBlur()
{
        if (FCKFocusManager.IsLocked) FCKFocusManager._HasPendingBlur = true;
        else
        {
                FCK.HasFocus = false;
                FCK.Events.FireEvent("OnBlur");
        }
};

function FCKFocusManager_Win_OnFocus_Area()
{
        if (FCKFocusManager._IsFocusing) return;
        FCKFocusManager._IsFocusing = true;
        FCK.Focus();
        FCKFocusManager_Win_OnFocus();
        FCKTools.RunFunction(function ()
        {
                delete FCKFocusManager._IsFocusing;
        });
};

function FCKFocusManager_Win_OnFocus()
{
        FCKFocusManager._ResetTimer();
        if (!FCK.HasFocus && !FCKFocusManager.IsLocked)
        {
                FCK.HasFocus = true;
                FCK.Events.FireEvent("OnFocus");
        }
};
(function ()
{
        var A = window.frameElement;
        var B = A.width;
        var C = A.height;
        if (/^\d+$/.test(B)) B += 'px';
        if (/^\d+$/.test(C)) C += 'px';
        var D = A.style;
        D.border = D.padding = D.margin = 0;
        D.backgroundColor = 'transparent';
        D.backgroundImage = 'none';
        D.width = B;
        D.height = C;
})();
FCK.Description = "FCKeditor for Internet Explorer 5.5+";
FCK._GetBehaviorsStyle = function ()
{
        if (!FCK._BehaviorsStyle)
        {
                var A = FCKConfig.BasePath;
                var B = '';
                var C;
                C = '<style type="text/css" _fcktemp="true">';
                if (FCKConfig.ShowBorders) B = 'url(' + A + 'css/behaviors/showtableborders.htc)';
                C += 'INPUT,TEXTAREA,SELECT,.FCK__Anchor,.FCK__PageBreak,.FCK__InputHidden';
                if (FCKConfig.DisableObjectResizing)
                {
                        C += ',IMG';
                        B += ' url(' + A + 'css/behaviors/disablehandles.htc)';
                };
                C += ' { behavior: url(' + A + 'css/behaviors/disablehandles.htc) ; }';
                if (B.length > 0) C += 'TABLE { behavior: ' + B + ' ; }';
                C += '</style>';
                FCK._BehaviorsStyle = C;
        };
        return FCK._BehaviorsStyle;
};

function Doc_OnMouseUp()
{
        if (FCK.EditorWindow.event.srcElement.tagName == 'HTML')
        {
                FCK.Focus();
                FCK.EditorWindow.event.cancelBubble = true;
                FCK.EditorWindow.event.returnValue = false;
        }
};

function Doc_OnPaste()
{
        var A = FCK.EditorDocument.body;
        A.detachEvent('onpaste', Doc_OnPaste);
        var B = FCK.Paste(!FCKConfig.ForcePasteAsPlainText && !FCKConfig.AutoDetectPasteFromWord);
        A.attachEvent('onpaste', Doc_OnPaste);
        return B;
};

function Doc_OnDblClick()
{
        FCK.OnDoubleClick(FCK.EditorWindow.event.srcElement);
        FCK.EditorWindow.event.cancelBubble = true;
};

function Doc_OnSelectionChange()
{
        if (!FCK.IsSelectionChangeLocked && FCK.EditorDocument) FCK.Events.FireEvent("OnSelectionChange");
};

function Doc_OnDrop()
{
        if (FCK.MouseDownFlag)
        {
                FCK.MouseDownFlag = false;
                return;
        };
        if (FCKConfig.ForcePasteAsPlainText)
        {
                var A = FCK.EditorWindow.event;
                if (FCK._CheckIsPastingEnabled() || FCKConfig.ShowDropDialog) FCK.PasteAsPlainText(A.dataTransfer.getData('Text'));
                A.returnValue = false;
                A.cancelBubble = true;
        }
};
FCK.InitializeBehaviors = function (A)
{
        this.EditorDocument.attachEvent('onmouseup', Doc_OnMouseUp);
        this.EditorDocument.body.attachEvent('onpaste', Doc_OnPaste);
        this.EditorDocument.body.attachEvent('ondrop', Doc_OnDrop);
        FCK.ContextMenu._InnerContextMenu.AttachToElement(FCK.EditorDocument.body);
        this.EditorDocument.attachEvent("onkeydown", FCK._KeyDownListener);
        this.EditorDocument.attachEvent("ondblclick", Doc_OnDblClick);
        this.EditorDocument.attachEvent("onbeforedeactivate", function ()
        {
                FCKSelection.Save();
        });
        this.EditorDocument.attachEvent("onselectionchange", Doc_OnSelectionChange);
        FCKTools.AddEventListener(FCK.EditorDocument, 'mousedown', Doc_OnMouseDown);
};
FCK.InsertHtml = function (A)
{
        A = FCKConfig.ProtectedSource.Protect(A);
        A = FCK.ProtectEvents(A);
        A = FCK.ProtectUrls(A);
        A = FCK.ProtectTags(A);
        FCKSelection.Restore();
        FCK.EditorWindow.focus();
        FCKUndo.SaveUndoStep();
        var B = FCKSelection.GetSelection();
        if (B.type.toLowerCase() == 'control') B.clear();
        A = '<span id="__fakeFCKRemove__" style="display:none;">fakeFCKRemove</span>' + A;
        B.createRange().pasteHTML(A);
        var C = FCK.EditorDocument.getElementById('__fakeFCKRemove__');
        if (C.parentNode.childNodes.length == 1) C = C.parentNode;
        C.removeNode(true);
        FCKDocumentProcessor.Process(FCK.EditorDocument);
        this.Events.FireEvent("OnSelectionChange");
};
FCK.SetInnerHtml = function (A)
{
        var B = FCK.EditorDocument;
        B.body.innerHTML = '<div id="__fakeFCKRemove__">&nbsp;</div>' + A;
        B.getElementById('__fakeFCKRemove__').removeNode(true);
};

function FCK_PreloadImages()
{
        var A = new FCKImagePreloader();
        A.AddImages(FCKConfig.PreloadImages);
        A.AddImages(FCKConfig.SkinPath + 'fck_strip.gif');
        A.OnComplete = LoadToolbarSetup;
        A.Start();
};

function Document_OnContextMenu()
{
        return (event.srcElement._FCKShowContextMenu == true);
};
document.oncontextmenu = Document_OnContextMenu;

function FCK_Cleanup()
{
        this.LinkedField = null;
        this.EditorWindow = null;
        this.EditorDocument = null;
};
FCK._ExecPaste = function ()
{
        if (FCK._PasteIsRunning) return true;
        if (FCKConfig.ForcePasteAsPlainText)
        {
                FCK.PasteAsPlainText();
                return false;
        };
        var A = FCK._CheckIsPastingEnabled(true);
        if (A === false) FCKTools.RunFunction(FCKDialog.OpenDialog, FCKDialog, ['FCKDialog_Paste', FCKLang.Paste, 'dialog/fck_paste.html', 400, 330, 'Security']);
        else
        {
                if (FCKConfig.AutoDetectPasteFromWord && A.length > 0)
                {
                        var B = /<\w[^>]*(( class="?MsoNormal"?)|(="mso-))/gi;
                        if (B.test(A))
                        {
                                if (confirm(FCKLang.PasteWordConfirm))
                                {
                                        FCK.PasteFromWord();
                                        return false;
                                }
                        }
                };
                FCK._PasteIsRunning = true;
                FCK.ExecuteNamedCommand('Paste');
                delete FCK._PasteIsRunning;
        };
        return false;
};
FCK.PasteAsPlainText = function (A)
{
        if (!FCK._CheckIsPastingEnabled())
        {
                FCKDialog.OpenDialog('FCKDialog_Paste', FCKLang.PasteAsText, 'dialog/fck_paste.html', 400, 330, 'PlainText');
                return;
        };
        var B = null;
        if (!A) B = clipboardData.getData("Text");
        else B = A;
        if (B && B.length > 0)
        {
                B = FCKTools.HTMLEncode(B);
                B = FCKTools.ProcessLineBreaks(window, FCKConfig, B);
                var C = B.search('</p>');
                var D = B.search('<p>');
                if ((C != -1 && D != -1 && C < D) || (C != -1 && D == -1))
                {
                        var E = B.substr(0, C);
                        B = B.substr(C + 4);
                        this.InsertHtml(E);
                };
                FCKUndo.SaveLocked = true;
                this.InsertHtml(B);
                FCKUndo.SaveLocked = false;
        }
};
FCK._CheckIsPastingEnabled = function (A)
{
        FCK._PasteIsEnabled = false;
        document.body.attachEvent('onpaste', FCK_CheckPasting_Listener);
        var B = FCK.GetClipboardHTML();
        document.body.detachEvent('onpaste', FCK_CheckPasting_Listener);
        if (FCK._PasteIsEnabled)
        {
                if (!A) B = true;
        }
        else B = false;
        delete FCK._PasteIsEnabled;
        return B;
};

function FCK_CheckPasting_Listener()
{
        FCK._PasteIsEnabled = true;
};
FCK.GetClipboardHTML = function ()
{
        var A = document.getElementById('___FCKHiddenDiv');
        if (!A)
        {
                A = document.createElement('DIV');
                A.id = '___FCKHiddenDiv';
                var B = A.style;
                B.position = 'absolute';
                B.visibility = B.overflow = 'hidden';
                B.width = B.height = 1;
                document.body.appendChild(A);
        };
        A.innerHTML = '';
        var C = document.body.createTextRange();
        C.moveToElementText(A);
        C.execCommand('Paste');
        var D = A.innerHTML;
        A.innerHTML = '';
        return D;
};
FCK.CreateLink = function (A, B)
{
        var C = [];
        var D = FCKSelection.GetType() == 'Control';
        var E = D && FCKSelection.GetSelectedElement();
        if (!(D && !FCKTools.GetElementAscensor(E, 'a'))) FCK.ExecuteNamedCommand('Unlink', null, false, !! B);
        if (A.length > 0)
        {
                if (D)
                {
                        var F = this.EditorDocument.createElement('A');
                        F.href = A;
                        var G = E;
                        G.parentNode.insertBefore(F, G);
                        G.parentNode.removeChild(G);
                        F.appendChild(G);
                        return [F];
                };
                var H = 'javascript:void(0);/*' + (new Date().getTime()) + '*/';
                FCK.ExecuteNamedCommand('CreateLink', H, false, !! B);
                var I = this.EditorDocument.links;
                for (i = 0; i < I.length; i++)
                {
                        var F = I[i];
                        if (F.getAttribute('href', 2) == H)
                        {
                                var K = F.innerHTML;
                                F.href = A;
                                F.innerHTML = K;
                                var L = F.lastChild;
                                if (L && L.nodeName == 'BR')
                                {
                                        FCKDomTools.InsertAfterNode(F, F.removeChild(L));
                                };
                                C.push(F);
                        }
                }
        };
        return C;
};

function _FCK_RemoveDisabledAtt()
{
        this.removeAttribute('disabled');
};

function Doc_OnMouseDown(A)
{
        var e = A.srcElement;
        if (e.nodeName && e.nodeName.IEquals('input') && e.type.IEquals(['radio', 'checkbox']) && !e.disabled)
        {
                e.disabled = true;
                FCKTools.SetTimeout(_FCK_RemoveDisabledAtt, 1, e);
        }
};
var FCKConfig = FCK.Config = {};
if (document.location.protocol == 'file:')
{
        FCKConfig.BasePath = decodeURIComponent(document.location.pathname.substr(1));
        FCKConfig.BasePath = FCKConfig.BasePath.replace(/\\/gi, '/');
        var sFullProtocol = document.location.href.match(/^(file\:\/{2,3})/)[1];
        if (FCKBrowserInfo.IsOpera) sFullProtocol += 'localhost/';
        FCKConfig.BasePath = sFullProtocol + FCKConfig.BasePath.substring(0, FCKConfig.BasePath.lastIndexOf('/') + 1);
}
else FCKConfig.BasePath = document.location.protocol + '//' + document.location.host + document.location.pathname.substring(0, document.location.pathname.lastIndexOf('/') + 1);
FCKConfig.FullBasePath = FCKConfig.BasePath;
FCKConfig.EditorPath = FCKConfig.BasePath.replace(/editor\/$/, '');
try
{
        FCKConfig.ScreenWidth = screen.width;
        FCKConfig.ScreenHeight = screen.height;
}
catch (e)
{
        FCKConfig.ScreenWidth = 800;
        FCKConfig.ScreenHeight = 600;
};
FCKConfig.ProcessHiddenField = function ()
{
        this.PageConfig = {};
        var A = window.parent.document.getElementById(FCK.Name + '___Config');
        if (!A) return;
        var B = A.value.split('&');
        for (var i = 0; i < B.length; i++)
        {
                if (B[i].length == 0) continue;
                var C = B[i].split('=');
                var D = decodeURIComponent(C[0]);
                var E = decodeURIComponent(C[1]);
                if (D == 'CustomConfigurationsPath') FCKConfig[D] = E;
                else if (E.toLowerCase() == "true") this.PageConfig[D] = true;
                else if (E.toLowerCase() == "false") this.PageConfig[D] = false;
                else if (E.length > 0 && !isNaN(E)) this.PageConfig[D] = parseFloat(E);
                else this.PageConfig[D] = E;
        }
};

function FCKConfig_LoadPageConfig()
{
        var A = FCKConfig.PageConfig;
        for (var B in A) FCKConfig[B] = A[B];
};

function FCKConfig_PreProcess()
{
        var A = FCKConfig;
        if (A.AllowQueryStringDebug)
        {
                try
                {
                        if ((/fckdebug=true/i).test(window.top.location.search)) A.Debug = true;
                }
                catch (e)
                {}
        };
        if (!A.PluginsPath.EndsWith('/')) A.PluginsPath += '/';
        var B = A.ToolbarComboPreviewCSS;
        if (!B || B.length == 0) A.ToolbarComboPreviewCSS = A.EditorAreaCSS;
        A.RemoveAttributesArray = (A.RemoveAttributes || '').split(',');
        if (!FCKConfig.SkinEditorCSS || FCKConfig.SkinEditorCSS.length == 0) FCKConfig.SkinEditorCSS = FCKConfig.SkinPath + 'fck_editor.css';
        if (!FCKConfig.SkinDialogCSS || FCKConfig.SkinDialogCSS.length == 0) FCKConfig.SkinDialogCSS = FCKConfig.SkinPath + 'fck_dialog.css';
};
FCKConfig.ToolbarSets = {};
FCKConfig.Plugins = {};
FCKConfig.Plugins.Items = [];
FCKConfig.Plugins.Add = function (A, B, C)
{
        FCKConfig.Plugins.Items.push([A, B, C]);
};
FCKConfig.ProtectedSource = {};
FCKConfig.ProtectedSource._CodeTag = (new Date()).valueOf();
FCKConfig.ProtectedSource.RegexEntries = [/<!--[\s\S]*?-->/g, /<script[\s\S]*?<\/script>/gi, /<noscript[\s\S]*?<\/noscript>/gi];
FCKConfig.ProtectedSource.Add = function (A)
{
        this.RegexEntries.push(A);
};
FCKConfig.ProtectedSource.Protect = function (A)
{
        var B = this._CodeTag;

        function _Replace(protectedSource)
        {
                var C = FCKTempBin.AddElement(protectedSource);
                return '<!--{' + B + C + '}-->';
        };
        for (var i = 0; i < this.RegexEntries.length; i++)
        {
                A = A.replace(this.RegexEntries[i], _Replace);
        };
        return A;
};
FCKConfig.ProtectedSource.Revert = function (A, B)
{
        function _Replace(m, opener, index)
        {
                var C = B ? FCKTempBin.RemoveElement(index) : FCKTempBin.Elements[index];
                return FCKConfig.ProtectedSource.Revert(C, B);
        };
        var D = new RegExp("(<|&lt;)!--\\{" + this._CodeTag + "(\\d+)\\}--(>|&gt;)", "g");
        return A.replace(D, _Replace);
};
FCKConfig.GetBodyAttributes = function ()
{
        var A = '';
        if (this.BodyId && this.BodyId.length > 0) A += ' id="' + this.BodyId + '"';
        if (this.BodyClass && this.BodyClass.length > 0) A += ' class="' + this.BodyClass + '"';
        return A;
};
FCKConfig.ApplyBodyAttributes = function (A)
{
        if (this.BodyId && this.BodyId.length > 0) A.id = FCKConfig.BodyId;
        if (this.BodyClass && this.BodyClass.length > 0) A.className += ' ' + FCKConfig.BodyClass;
};
var FCKDebug = {
        Output: function ()
        {},
        OutputObject: function ()
        {}
};
var FCKDomTools = {
        MoveChildren: function (A, B, C)
        {
                if (A == B) return;
                var D;
                if (C)
                {
                        while ((D = A.lastChild)) B.insertBefore(A.removeChild(D), B.firstChild);
                }
                else
                {
                        while ((D = A.firstChild)) B.appendChild(A.removeChild(D));
                }
        },
        MoveNode: function (A, B, C)
        {
                if (C) B.insertBefore(FCKDomTools.RemoveNode(A), B.firstChild);
                else B.appendChild(FCKDomTools.RemoveNode(A));
        },
        TrimNode: function (A)
        {
                this.LTrimNode(A);
                this.RTrimNode(A);
        },
        LTrimNode: function (A)
        {
                var B;
                while ((B = A.firstChild))
                {
                        if (B.nodeType == 3)
                        {
                                var C = B.nodeValue.LTrim();
                                var D = B.nodeValue.length;
                                if (C.length == 0)
                                {
                                        A.removeChild(B);
                                        continue;
                                }
                                else if (C.length < D)
                                {
                                        B.splitText(D - C.length);
                                        A.removeChild(A.firstChild);
                                }
                        };
                        break;
                }
        },
        RTrimNode: function (A)
        {
                var B;
                while ((B = A.lastChild))
                {
                        if (B.nodeType == 3)
                        {
                                var C = B.nodeValue.RTrim();
                                var D = B.nodeValue.length;
                                if (C.length == 0)
                                {
                                        B.parentNode.removeChild(B);
                                        continue;
                                }
                                else if (C.length < D)
                                {
                                        B.splitText(C.length);
                                        A.lastChild.parentNode.removeChild(A.lastChild);
                                }
                        };
                        break;
                };
                if (!FCKBrowserInfo.IsIE && !FCKBrowserInfo.IsOpera)
                {
                        B = A.lastChild;
                        if (B && B.nodeType == 1 && B.nodeName.toLowerCase() == 'br')
                        {
                                B.parentNode.removeChild(B);
                        }
                }
        },
        RemoveNode: function (A, B)
        {
                if (B)
                {
                        var C;
                        while ((C = A.firstChild)) A.parentNode.insertBefore(A.removeChild(C), A);
                };
                return A.parentNode.removeChild(A);
        },
        GetFirstChild: function (A, B)
        {
                if (typeof (B) == 'string') B = [B];
                var C = A.firstChild;
                while (C)
                {
                        if (C.nodeType == 1 && C.tagName.Equals.apply(C.tagName, B)) return C;
                        C = C.nextSibling;
                };
                return null;
        },
        GetLastChild: function (A, B)
        {
                if (typeof (B) == 'string') B = [B];
                var C = A.lastChild;
                while (C)
                {
                        if (C.nodeType == 1 && (!B || C.tagName.Equals(B))) return C;
                        C = C.previousSibling;
                };
                return null;
        },
        GetPreviousSourceElement: function (A, B, C, D)
        {
                if (!A) return null;
                if (C && A.nodeType == 1 && A.nodeName.IEquals(C)) return null;
                if (A.previousSibling) A = A.previousSibling;
                else return this.GetPreviousSourceElement(A.parentNode, B, C, D);
                while (A)
                {
                        if (A.nodeType == 1)
                        {
                                if (C && A.nodeName.IEquals(C)) break;
                                if (!D || !A.nodeName.IEquals(D)) return A;
                        }
                        else if (B && A.nodeType == 3 && A.nodeValue.RTrim().length > 0) break;
                        if (A.lastChild) A = A.lastChild;
                        else return this.GetPreviousSourceElement(A, B, C, D);
                };
                return null;
        },
        GetNextSourceElement: function (A, B, C, D, E)
        {
                while ((A = this.GetNextSourceNode(A, E)))
                {
                        if (A.nodeType == 1)
                        {
                                if (C && A.nodeName.IEquals(C)) break;
                                if (D && A.nodeName.IEquals(D)) return this.GetNextSourceElement(A, B, C, D);
                                return A;
                        }
                        else if (B && A.nodeType == 3 && A.nodeValue.RTrim().length > 0) break;
                };
                return null;
        },
        GetNextSourceNode: function (A, B, C, D)
        {
                if (!A) return null;
                var E;
                if (!B && A.firstChild) E = A.firstChild;
                else
                {
                        if (D && A == D) return null;
                        E = A.nextSibling;
                        if (!E && (!D || D != A.parentNode)) return this.GetNextSourceNode(A.parentNode, true, C, D);
                };
                if (C && E && E.nodeType != C) return this.GetNextSourceNode(E, false, C, D);
                return E;
        },
        GetPreviousSourceNode: function (A, B, C, D)
        {
                if (!A) return null;
                var E;
                if (!B && A.lastChild) E = A.lastChild;
                else
                {
                        if (D && A == D) return null;
                        E = A.previousSibling;
                        if (!E && (!D || D != A.parentNode)) return this.GetPreviousSourceNode(A.parentNode, true, C, D);
                };
                if (C && E && E.nodeType != C) return this.GetPreviousSourceNode(E, false, C, D);
                return E;
        },
        InsertAfterNode: function (A, B)
        {
                return A.parentNode.insertBefore(B, A.nextSibling);
        },
        GetParents: function (A)
        {
                var B = [];
                while (A)
                {
                        B.unshift(A);
                        A = A.parentNode;
                };
                return B;
        },
        GetCommonParents: function (A, B)
        {
                var C = this.GetParents(A);
                var D = this.GetParents(B);
                var E = [];
                for (var i = 0; i < C.length; i++)
                {
                        if (C[i] == D[i]) E.push(C[i]);
                };
                return E;
        },
        GetCommonParentNode: function (A, B, C)
        {
                var D = {};
                if (!C.pop) C = [C];
                while (C.length > 0) D[C.pop().toLowerCase()] = 1;
                var E = this.GetCommonParents(A, B);
                var F = null;
                while ((F = E.pop()))
                {
                        if (D[F.nodeName.toLowerCase()]) return F;
                };
                return null;
        },
        GetIndexOf: function (A)
        {
                var B = A.parentNode ? A.parentNode.firstChild : null;
                var C = -1;
                while (B)
                {
                        C++;
                        if (B == A) return C;
                        B = B.nextSibling;
                };
                return -1;
        },
        PaddingNode: null,
        EnforcePaddingNode: function (A, B)
        {
                try
                {
                        if (!A || !A.body) return;
                }
                catch (e)
                {
                        return;
                };
                this.CheckAndRemovePaddingNode(A, B, true);
                try
                {
                        if (A.body.lastChild && (A.body.lastChild.nodeType != 1 || A.body.lastChild.tagName.toLowerCase() == B.toLowerCase())) return;
                }
                catch (e)
                {
                        return;
                };
                var C = A.createElement(B);
                if (FCKBrowserInfo.IsGecko && FCKListsLib.NonEmptyBlockElements[B]) FCKTools.AppendBogusBr(C);
                this.PaddingNode = C;
                if (A.body.childNodes.length == 1 && A.body.firstChild.nodeType == 1 && A.body.firstChild.tagName.toLowerCase() == 'br' && (A.body.firstChild.getAttribute('_moz_dirty') != null || A.body.firstChild.getAttribute('type') == '_moz')) A.body.replaceChild(C, A.body.firstChild);
                else A.body.appendChild(C);
        },
        CheckAndRemovePaddingNode: function (A, B, C)
        {
                var D = this.PaddingNode;
                if (!D) return;
                try
                {
                        if (D.parentNode != A.body || D.tagName.toLowerCase() != B || (D.childNodes.length > 1) || (D.firstChild && D.firstChild.nodeValue != '\xa0' && String(D.firstChild.tagName).toLowerCase() != 'br'))
                        {
                                this.PaddingNode = null;
                                return;
                        }
                }
                catch (e)
                {
                        this.PaddingNode = null;
                        return;
                };
                if (!C)
                {
                        if (D.parentNode.childNodes.length > 1) D.parentNode.removeChild(D);
                        this.PaddingNode = null;
                }
        },
        HasAttribute: function (A, B)
        {
                if (A.hasAttribute) return A.hasAttribute(B);
                else
                {
                        var C = A.attributes[B];
                        return (C != undefined && C.specified);
                }
        },
        HasAttributes: function (A)
        {
                var B = A.attributes;
                for (var i = 0; i < B.length; i++)
                {
                        if (FCKBrowserInfo.IsIE)
                        {
                                var C = B[i].nodeName;
                                if (C.StartsWith('_fck'))
                                {
                                        continue;
                                };
                                if (C == 'class')
                                {
                                        if (A.className.length > 0) return true;
                                        continue;
                                }
                        };
                        if (B[i].specified) return true;
                };
                return false;
        },
        RemoveAttribute: function (A, B)
        {
                if (FCKBrowserInfo.IsIE && B.toLowerCase() == 'class') B = 'className';
                return A.removeAttribute(B, 0);
        },
        RemoveAttributes: function (A, B)
        {
                for (var i = 0; i < B.length; i++) this.RemoveAttribute(A, B[i]);
        },
        GetAttributeValue: function (A, B)
        {
                var C = B;
                if (typeof B == 'string') B = A.attributes[B];
                else C = B.nodeName;
                if (B && B.specified)
                {
                        if (C == 'style') return A.style.cssText;
                        else if (C == 'class' || C.indexOf('on') == 0) return B.nodeValue;
                        else
                        {
                                return A.getAttribute(C, 2);
                        }
                };
                return null;
        },
        Contains: function (A, B)
        {
                if (A.contains && B.nodeType == 1) return A.contains(B);
                while ((B = B.parentNode))
                {
                        if (B == A) return true;
                };
                return false;
        },
        BreakParent: function (A, B, C)
        {
                var D = C || new FCKDomRange(FCKTools.GetElementWindow(A));
                D.SetStart(A, 4);
                D.SetEnd(B, 4);
                var E = D.ExtractContents();
                D.InsertNode(A.parentNode.removeChild(A));
                E.InsertAfterNode(A);
                D.Release( !! C);
        },
        GetNodeAddress: function (A, B)
        {
                var C = [];
                while (A && A != FCKTools.GetElementDocument(A).documentElement)
                {
                        var D = A.parentNode;
                        var E = -1;
                        for (var i = 0; i < D.childNodes.length; i++)
                        {
                                var F = D.childNodes[i];
                                if (B === true && F.nodeType == 3 && F.previousSibling && F.previousSibling.nodeType == 3) continue;
                                E++;
                                if (D.childNodes[i] == A) break;
                        };
                        C.unshift(E);
                        A = A.parentNode;
                };
                return C;
        },
        GetNodeFromAddress: function (A, B, C)
        {
                var D = A.documentElement;
                for (var i = 0; i < B.length; i++)
                {
                        var E = B[i];
                        if (!C)
                        {
                                D = D.childNodes[E];
                                continue;
                        };
                        var F = -1;
                        for (var j = 0; j < D.childNodes.length; j++)
                        {
                                var G = D.childNodes[j];
                                if (C === true && G.nodeType == 3 && G.previousSibling && G.previousSibling.nodeType == 3) continue;
                                F++;
                                if (F == E)
                                {
                                        D = G;
                                        break;
                                }
                        }
                };
                return D;
        },
        CloneElement: function (A)
        {
                A = A.cloneNode(false);
                A.removeAttribute('id', false);
                return A;
        },
        ClearElementJSProperty: function (A, B)
        {
                if (FCKBrowserInfo.IsIE) A.removeAttribute(B);
                else delete A[B];
        },
        SetElementMarker: function (A, B, C, D)
        {
                var E = String(parseInt(Math.random() * 0xffffffff, 10));
                B._FCKMarkerId = E;
                B[C] = D;
                if (!A[E]) A[E] = {
                        'element': B,
                        'markers': {}
                };
                A[E]['markers'][C] = D;
        },
        ClearElementMarkers: function (A, B, C)
        {
                var D = B._FCKMarkerId;
                if (!D) return;
                this.ClearElementJSProperty(B, '_FCKMarkerId');
                for (var j in A[D]['markers']) this.ClearElementJSProperty(B, j);
                if (C) delete A[D];
        },
        ClearAllMarkers: function (A)
        {
                for (var i in A) this.ClearElementMarkers(A, A[i]['element'], true);
        },
        ListToArray: function (A, B, C, D, E)
        {
                if (!A.nodeName.IEquals(['ul', 'ol'])) return [];
                if (!D) D = 0;
                if (!C) C = [];
                for (var i = 0; i < A.childNodes.length; i++)
                {
                        var F = A.childNodes[i];
                        if (!F.nodeName.IEquals('li')) continue;
                        var G = {
                                'parent': A,
                                'indent': D,
                                'contents': []
                        };
                        if (!E)
                        {
                                G.grandparent = A.parentNode;
                                if (G.grandparent && G.grandparent.nodeName.IEquals('li')) G.grandparent = G.grandparent.parentNode;
                        }
                        else G.grandparent = E;
                        if (B) this.SetElementMarker(B, F, '_FCK_ListArray_Index', C.length);
                        C.push(G);
                        for (var j = 0; j < F.childNodes.length; j++)
                        {
                                var H = F.childNodes[j];
                                if (H.nodeName.IEquals(['ul', 'ol'])) this.ListToArray(H, B, C, D + 1, G.grandparent);
                                else G.contents.push(H);
                        }
                };
                return C;
        },
        ArrayToList: function (A, B, C)
        {
                if (C == undefined) C = 0;
                if (!A || A.length < C + 1) return null;
                var D = FCKTools.GetElementDocument(A[C].parent);
                var E = D.createDocumentFragment();
                var F = null;
                var G = C;
                var H = Math.max(A[C].indent, 0);
                var I = null;
                while (true)
                {
                        var J = A[G];
                        if (J.indent == H)
                        {
                                if (!F || A[G].parent.nodeName != F.nodeName)
                                {
                                        F = A[G].parent.cloneNode(false);
                                        E.appendChild(F);
                                };
                                I = D.createElement('li');
                                F.appendChild(I);
                                for (var i = 0; i < J.contents.length; i++) I.appendChild(J.contents[i].cloneNode(true));
                                G++;
                        }
                        else if (J.indent == Math.max(H, 0) + 1)
                        {
                                var K = this.ArrayToList(A, null, G);
                                I.appendChild(K.listNode);
                                G = K.nextIndex;
                        }
                        else if (J.indent == -1 && C == 0 && J.grandparent)
                        {
                                var I;
                                if (J.grandparent.nodeName.IEquals(['ul', 'ol'])) I = D.createElement('li');
                                else
                                {
                                        if (FCKConfig.EnterMode.IEquals(['div', 'p']) && !J.grandparent.nodeName.IEquals('td')) I = D.createElement(FCKConfig.EnterMode);
                                        else I = D.createDocumentFragment();
                                };
                                for (var i = 0; i < J.contents.length; i++) I.appendChild(J.contents[i].cloneNode(true));
                                if (I.nodeType == 11)
                                {
                                        if (I.lastChild && I.lastChild.getAttribute && I.lastChild.getAttribute('type') == '_moz') I.removeChild(I.lastChild);
                                        I.appendChild(D.createElement('br'));
                                };
                                if (I.nodeName.IEquals(FCKConfig.EnterMode) && I.firstChild)
                                {
                                        this.TrimNode(I);
                                        if (FCKListsLib.BlockBoundaries[I.firstChild.nodeName.toLowerCase()])
                                        {
                                                var M = D.createDocumentFragment();
                                                while (I.firstChild) M.appendChild(I.removeChild(I.firstChild));
                                                I = M;
                                        }
                                };
                                if (FCKBrowserInfo.IsGeckoLike && I.nodeName.IEquals(['div', 'p'])) FCKTools.AppendBogusBr(I);
                                E.appendChild(I);
                                F = null;
                                G++;
                        }
                        else return null;
                        if (A.length <= G || Math.max(A[G].indent, 0) < H)
                        {
                                break;
                        }
                };
                if (B)
                {
                        var N = E.firstChild;
                        while (N)
                        {
                                if (N.nodeType == 1) this.ClearElementMarkers(B, N);
                                N = this.GetNextSourceNode(N);
                        }
                };
                return {
                        'listNode': E,
                        'nextIndex': G
                };
        },
        GetNextSibling: function (A, B)
        {
                A = A.nextSibling;
                while (A && !B && A.nodeType != 1 && (A.nodeType != 3 || A.nodeValue.length == 0)) A = A.nextSibling;
                return A;
        },
        GetPreviousSibling: function (A, B)
        {
                A = A.previousSibling;
                while (A && !B && A.nodeType != 1 && (A.nodeType != 3 || A.nodeValue.length == 0)) A = A.previousSibling;
                return A;
        },
        CheckIsEmptyElement: function (A, B)
        {
                var C = A.firstChild;
                var D;
                while (C)
                {
                        if (C.nodeType == 1)
                        {
                                if (D || !FCKListsLib.InlineNonEmptyElements[C.nodeName.toLowerCase()]) return false;
                                if (!B || B(C) === true) D = C;
                        }
                        else if (C.nodeType == 3 && C.nodeValue.length > 0) return false;
                        C = C.nextSibling;
                };
                return D ? this.CheckIsEmptyElement(D, B) : true;
        },
        SetElementStyles: function (A, B)
        {
                var C = A.style;
                for (var D in B) C[D] = B[D];
        },
        SetOpacity: function (A, B)
        {
                if (FCKBrowserInfo.IsIE)
                {
                        B = Math.round(B * 100);
                        A.style.filter = (B > 100 ? '' : 'progid:DXImageTransform.Microsoft.Alpha(opacity=' + B + ')');
                }
                else A.style.opacity = B;
        },
        GetCurrentElementStyle: function (A, B)
        {
                if (FCKBrowserInfo.IsIE) return A.currentStyle[B];
                else return A.ownerDocument.defaultView.getComputedStyle(A, '').getPropertyValue(B);
        },
        GetPositionedAncestor: function (A)
        {
                var B = A;
                while (B != FCKTools.GetElementDocument(B).documentElement)
                {
                        if (this.GetCurrentElementStyle(B, 'position') != 'static') return B;
                        if (B == FCKTools.GetElementDocument(B).documentElement && currentWindow != w) B = currentWindow.frameElement;
                        else B = B.parentNode;
                };
                return null;
        },
        ScrollIntoView: function (A, B)
        {
                var C = FCKTools.GetElementWindow(A);
                var D = FCKTools.GetViewPaneSize(C).Height;
                var E = D * -1;
                if (B === false)
                {
                        E += A.offsetHeight || 0;
                        E += parseInt(this.GetCurrentElementStyle(A, 'marginBottom') || 0, 10) || 0;
                };
                var F = FCKTools.GetDocumentPosition(C, A);
                E += F.y;
                var G = FCKTools.GetScrollPosition(C).Y;
                if (E > 0 && (E > G || E < G - D)) C.scrollTo(0, E);
        },
        CheckIsEditable: function (A)
        {
                var B = A.nodeName.toLowerCase();
                var C = FCK.DTD[B] || FCK.DTD.span;
                return (C['#'] && !FCKListsLib.NonEditableElements[B]);
        },
        GetSelectedDivContainers: function ()
        {
                var A = [];
                var B = new FCKDomRange(FCK.EditorWindow);
                B.MoveToSelection();
                var C = B.GetTouchedStartNode();
                var D = B.GetTouchedEndNode();
                var E = C;
                if (C == D)
                {
                        while (D.nodeType == 1 && D.lastChild) D = D.lastChild;
                        D = FCKDomTools.GetNextSourceNode(D);
                }
                while (E && E != D)
                {
                        if (E.nodeType != 3 || !/^[ \t\n]*$/.test(E.nodeValue))
                        {
                                var F = new FCKElementPath(E);
                                var G = F.BlockLimit;
                                if (G && G.nodeName.IEquals('div') && A.IndexOf(G) == -1) A.push(G);
                        };
                        E = FCKDomTools.GetNextSourceNode(E);
                };
                return A;
        }
};
var FCKTools = {};
FCKTools.CreateBogusBR = function (A)
{
        var B = A.createElement('br');
        B.setAttribute('type', '_moz');
        return B;
};
FCKTools.FixCssUrls = function (A, B)
{
        if (!A || A.length == 0) return B;
        return B.replace(/url\s*\(([\s'"]*)(.*?)([\s"']*)\)/g, function (match, opener, path, closer)
        {
                if (/^\/|^\w?:/.test(path)) return match;
                else return 'url(' + opener + A + path + closer + ')';
        });
};
FCKTools._GetUrlFixedCss = function (A, B)
{
        var C = A.match(/^([^|]+)\|([\s\S]*)/);
        if (C) return FCKTools.FixCssUrls(C[1], C[2]);
        else return A;
};
FCKTools.AppendStyleSheet = function (A, B)
{
        if (!B) return [];
        if (typeof (B) == 'string')
        {
                if (/[\\\/\.][^{}]*$/.test(B))
                {
                        return this.AppendStyleSheet(A, B.split(','));
                }
                else return [this.AppendStyleString(A, FCKTools._GetUrlFixedCss(B))];
        }
        else
        {
                var C = [];
                for (var i = 0; i < B.length; i++) C.push(this._AppendStyleSheet(A, B[i]));
                return C;
        }
};
FCKTools.GetStyleHtml = (function ()
{
        var A = function (styleDef, markTemp)
                {
                        if (styleDef.length == 0) return '';
                        var B = markTemp ? ' _fcktemp="true"' : '';
                        return '<style type="text/css"' + B + '>' + styleDef + '</style>';
                };
        var C = function (cssFileUrl, markTemp)
                {
                        if (cssFileUrl.length == 0) return '';
                        var B = markTemp ? ' _fcktemp="true"' : '';
                        return '<link href="' + cssFileUrl + '" type="text/css" rel="stylesheet" ' + B + '/>';
                };
        return function (cssFileOrArrayOrDef, markTemp)
        {
                if (!cssFileOrArrayOrDef) return '';
                if (typeof (cssFileOrArrayOrDef) == 'string')
                {
                        if (/[\\\/\.][^{}]*$/.test(cssFileOrArrayOrDef))
                        {
                                return this.GetStyleHtml(cssFileOrArrayOrDef.split(','), markTemp);
                        }
                        else return A(this._GetUrlFixedCss(cssFileOrArrayOrDef), markTemp);
                }
                else
                {
                        var E = '';
                        for (var i = 0; i < cssFileOrArrayOrDef.length; i++) E += C(cssFileOrArrayOrDef[i], markTemp);
                        return E;
                }
        }
})();
FCKTools.GetElementDocument = function (A)
{
        return A.ownerDocument || A.document;
};
FCKTools.GetElementWindow = function (A)
{
        return this.GetDocumentWindow(this.GetElementDocument(A));
};
FCKTools.GetDocumentWindow = function (A)
{
        if (FCKBrowserInfo.IsSafari && !A.parentWindow) this.FixDocumentParentWindow(window.top);
        return A.parentWindow || A.defaultView;
};
FCKTools.FixDocumentParentWindow = function (A)
{
        if (A.document) A.document.parentWindow = A;
        for (var i = 0; i < A.frames.length; i++) FCKTools.FixDocumentParentWindow(A.frames[i]);
};
FCKTools.HTMLEncode = function (A)
{
        if (!A) return '';
        A = A.replace(/&/g, '&amp;');
        A = A.replace(/</g, '&lt;');
        A = A.replace(/>/g, '&gt;');
        return A;
};
FCKTools.HTMLDecode = function (A)
{
        if (!A) return '';
        A = A.replace(/&gt;/g, '>');
        A = A.replace(/&lt;/g, '<');
        A = A.replace(/&amp;/g, '&');
        return A;
};
FCKTools._ProcessLineBreaksForPMode = function (A, B, C, D, E)
{
        var F = 0;
        var G = "<p>";
        var H = "</p>";
        var I = "<br />";
        if (C)
        {
                G = "<li>";
                H = "</li>";
                F = 1;
        }
        while (D && D != A.FCK.EditorDocument.body)
        {
                if (D.tagName.toLowerCase() == 'p')
                {
                        F = 1;
                        break;
                };
                D = D.parentNode;
        };
        for (var i = 0; i < B.length; i++)
        {
                var c = B.charAt(i);
                if (c == '\r') continue;
                if (c != '\n')
                {
                        E.push(c);
                        continue;
                };
                var n = B.charAt(i + 1);
                if (n == '\r')
                {
                        i++;
                        n = B.charAt(i + 1);
                };
                if (n == '\n')
                {
                        i++;
                        if (F) E.push(H);
                        E.push(G);
                        F = 1;
                }
                else E.push(I);
        }
};
FCKTools._ProcessLineBreaksForDivMode = function (A, B, C, D, E)
{
        var F = 0;
        var G = "<div>";
        var H = "</div>";
        if (C)
        {
                G = "<li>";
                H = "</li>";
                F = 1;
        }
        while (D && D != A.FCK.EditorDocument.body)
        {
                if (D.tagName.toLowerCase() == 'div')
                {
                        F = 1;
                        break;
                };
                D = D.parentNode;
        };
        for (var i = 0; i < B.length; i++)
        {
                var c = B.charAt(i);
                if (c == '\r') continue;
                if (c != '\n')
                {
                        E.push(c);
                        continue;
                };
                if (F)
                {
                        if (E[E.length - 1] == G)
                        {
                                E.push("&nbsp;");
                        };
                        E.push(H);
                };
                E.push(G);
                F = 1;
        };
        if (F) E.push(H);
};
FCKTools._ProcessLineBreaksForBrMode = function (A, B, C, D, E)
{
        var F = 0;
        var G = "<br />";
        var H = "";
        if (C)
        {
                G = "<li>";
                H = "</li>";
                F = 1;
        };
        for (var i = 0; i < B.length; i++)
        {
                var c = B.charAt(i);
                if (c == '\r') continue;
                if (c != '\n')
                {
                        E.push(c);
                        continue;
                };
                if (F && H.length) E.push(H);
                E.push(G);
                F = 1;
        }
};
FCKTools.ProcessLineBreaks = function (A, B, C)
{
        var D = B.EnterMode.toLowerCase();
        var E = [];
        var F = 0;
        var G = new A.FCKDomRange(A.FCK.EditorWindow);
        G.MoveToSelection();
        var H = G._Range.startContainer;
        while (H && H.nodeType != 1) H = H.parentNode;
        if (H && H.tagName.toLowerCase() == 'li') F = 1;
        if (D == 'p') this._ProcessLineBreaksForPMode(A, C, F, H, E);
        else if (D == 'div') this._ProcessLineBreaksForDivMode(A, C, F, H, E);
        else if (D == 'br') this._ProcessLineBreaksForBrMode(A, C, F, H, E);
        return E.join("");
};
FCKTools.AddSelectOption = function (A, B, C)
{
        var D = FCKTools.GetElementDocument(A).createElement("OPTION");
        D.text = B;
        D.value = C;
        A.options.add(D);
        return D;
};
FCKTools.RunFunction = function (A, B, C, D)
{
        if (A) this.SetTimeout(A, 0, B, C, D);
};
FCKTools.SetTimeout = function (A, B, C, D, E)
{
        return (E || window).setTimeout(function ()
        {
                if (D) A.apply(C, [].concat(D));
                else A.apply(C);
        }, B);
};
FCKTools.SetInterval = function (A, B, C, D, E)
{
        return (E || window).setInterval(function ()
        {
                A.apply(C, D || []);
        }, B);
};
FCKTools.ConvertStyleSizeToHtml = function (A)
{
        return A.EndsWith('%') ? A : parseInt(A, 10);
};
FCKTools.ConvertHtmlSizeToStyle = function (A)
{
        return A.EndsWith('%') ? A : (A + 'px');
};
FCKTools.GetElementAscensor = function (A, B)
{
        var e = A;
        var C = "," + B.toUpperCase() + ",";
        while (e)
        {
                if (C.indexOf("," + e.nodeName.toUpperCase() + ",") != -1) return e;
                e = e.parentNode;
        };
        return null;
};
FCKTools.CreateEventListener = function (A, B)
{
        var f = function ()
                {
                        var C = [];
                        for (var i = 0; i < arguments.length; i++) C.push(arguments[i]);
                        A.apply(this, C.concat(B));
                };
        return f;
};
FCKTools.IsStrictMode = function (A)
{
        return ('CSS1Compat' == (A.compatMode || (FCKBrowserInfo.IsSafari ? 'CSS1Compat' : null)));
};
FCKTools.ArgumentsToArray = function (A, B, C)
{
        B = B || 0;
        C = C || A.length;
        var D = [];
        for (var i = B; i < B + C && i < A.length; i++) D.push(A[i]);
        return D;
};
FCKTools.CloneObject = function (A)
{
        var B = function ()
                {};
        B.prototype = A;
        return new B;
};
FCKTools.AppendBogusBr = function (A)
{
        if (!A) return;
        var B = this.GetLastItem(A.getElementsByTagName('br'));
        if (!B || (B.getAttribute('type', 2) != '_moz' && B.getAttribute('_moz_dirty') == null))
        {
                var C = this.GetElementDocument(A);
                if (FCKBrowserInfo.IsOpera) A.appendChild(C.createTextNode(''));
                else A.appendChild(this.CreateBogusBR(C));
        }
};
FCKTools.GetLastItem = function (A)
{
        if (A.length > 0) return A[A.length - 1];
        return null;
};
FCKTools.GetDocumentPosition = function (w, A)
{
        var x = 0;
        var y = 0;
        var B = A;
        var C = null;
        var D = FCKTools.GetElementWindow(B);
        while (B && !(D == w && (B == w.document.body || B == w.document.documentElement)))
        {
                x += B.offsetLeft - B.scrollLeft;
                y += B.offsetTop - B.scrollTop;
                if (!FCKBrowserInfo.IsOpera)
                {
                        var E = C;
                        while (E && E != B)
                        {
                                x -= E.scrollLeft;
                                y -= E.scrollTop;
                                E = E.parentNode;
                        }
                };
                C = B;
                if (B.offsetParent) B = B.offsetParent;
                else
                {
                        if (D != w)
                        {
                                B = D.frameElement;
                                C = null;
                                if (B) D = B.contentWindow.parent;
                        }
                        else B = null;
                }
        };
        if (FCKDomTools.GetCurrentElementStyle(w.document.body, 'position') != 'static' || (FCKBrowserInfo.IsIE && FCKDomTools.GetPositionedAncestor(A) == null))
        {
                x += w.document.body.offsetLeft;
                y += w.document.body.offsetTop;
        };
        return {
                "x": x,
                "y": y
        };
};
FCKTools.GetWindowPosition = function (w, A)
{
        var B = this.GetDocumentPosition(w, A);
        var C = FCKTools.GetScrollPosition(w);
        B.x -= C.X;
        B.y -= C.Y;
        return B;
};
FCKTools.ProtectFormStyles = function (A)
{
        if (!A || A.nodeType != 1 || A.tagName.toLowerCase() != 'form') return [];
        var B = [];
        var C = ['style', 'className'];
        for (var i = 0; i < C.length; i++)
        {
                var D = C[i];
                if (A.elements.namedItem(D))
                {
                        var E = A.elements.namedItem(D);
                        B.push([E, E.nextSibling]);
                        A.removeChild(E);
                }
        };
        return B;
};
FCKTools.RestoreFormStyles = function (A, B)
{
        if (!A || A.nodeType != 1 || A.tagName.toLowerCase() != 'form') return;
        if (B.length > 0)
        {
                for (var i = B.length - 1; i >= 0; i--)
                {
                        var C = B[i][0];
                        var D = B[i][1];
                        if (D) A.insertBefore(C, D);
                        else A.appendChild(C);
                }
        }
};
FCKTools.GetNextNode = function (A, B)
{
        if (A.firstChild) return A.firstChild;
        else if (A.nextSibling) return A.nextSibling;
        else
        {
                var C = A.parentNode;
                while (C)
                {
                        if (C == B) return null;
                        if (C.nextSibling) return C.nextSibling;
                        else C = C.parentNode;
                }
        };
        return null;
};
FCKTools.GetNextTextNode = function (A, B, C)
{
        node = this.GetNextNode(A, B);
        if (C && node && C(node)) return null;
        while (node && node.nodeType != 3)
        {
                node = this.GetNextNode(node, B);
                if (C && node && C(node)) return null;
        };
        return node;
};
FCKTools.Merge = function ()
{
        var A = arguments;
        var o = A[0];
        for (var i = 1; i < A.length; i++)
        {
                var B = A[i];
                for (var p in B) o[p] = B[p];
        };
        return o;
};
FCKTools.IsArray = function (A)
{
        return (A instanceof Array);
};
FCKTools.AppendLengthProperty = function (A, B)
{
        var C = 0;
        for (var n in A) C++;
        return A[B || 'length'] = C;
};
FCKTools.NormalizeCssText = function (A)
{
        var B = document.createElement('span');
        B.style.cssText = A;
        return B.style.cssText;
};
FCKTools.Bind = function (A, B)
{
        return function ()
        {
                return B.apply(A, arguments);
        };
};
FCKTools.GetVoidUrl = function ()
{
        if (FCK_IS_CUSTOM_DOMAIN) return "javascript: void( function(){document.open();document.write('<html><head><title></title></head><body></body></html>');document.domain = '" + FCK_RUNTIME_DOMAIN + "';document.close();}() ) ;";
        if (FCKBrowserInfo.IsIE)
        {
                if (FCKBrowserInfo.IsIE7 || !FCKBrowserInfo.IsIE6) return "";
                else return "javascript: '';";
        };
        return "javascript: void(0);";
};
FCKTools.ResetStyles = function (A)
{
        A.style.cssText = 'margin:0;padding:0;border:0;background-color:transparent;background-image:none;';
};
FCKTools.CancelEvent = function (e)
{
        return false;
};
FCKTools._AppendStyleSheet = function (A, B)
{
        return A.createStyleSheet(B).owningElement;
};
FCKTools.AppendStyleString = function (A, B)
{
        if (!B) return null;
        var s = A.createStyleSheet("");
        s.cssText = B;
        return s;
};
FCKTools.ClearElementAttributes = function (A)
{
        A.clearAttributes();
};
FCKTools.GetAllChildrenIds = function (A)
{
        var B = [];
        for (var i = 0; i < A.all.length; i++)
        {
                var C = A.all[i].id;
                if (C && C.length > 0) B[B.length] = C;
        };
        return B;
};
FCKTools.RemoveOuterTags = function (e)
{
        e.insertAdjacentHTML('beforeBegin', e.innerHTML);
        e.parentNode.removeChild(e);
};
FCKTools.CreateXmlObject = function (A)
{
        var B;
        switch (A)
        {
        case 'XmlHttp':
                if (document.location.protocol != 'file:') try
                {
                        return new XMLHttpRequest();
                }
                catch (e)
                {};
                B = ['MSXML2.XmlHttp', 'Microsoft.XmlHttp'];
                break;
        case 'DOMDocument':
                B = ['MSXML2.DOMDocument', 'Microsoft.XmlDom'];
                break;
        };
        for (var i = 0; i < 2; i++)
        {
                try
                {
                        return new ActiveXObject(B[i]);
                }
                catch (e)
                {}
        };
        if (FCKLang.NoActiveX)
        {
                alert(FCKLang.NoActiveX);
                FCKLang.NoActiveX = null;
        };
        return null;
};
FCKTools.DisableSelection = function (A)
{
        A.unselectable = 'on';
        var e, i = 0;
        while ((e = A.all[i++]))
        {
                switch (e.tagName)
                {
                case 'IFRAME':
                case 'TEXTAREA':
                case 'INPUT':
                case 'SELECT':
                        break;
                default:
                        e.unselectable = 'on';
                }
        }
};
FCKTools.GetScrollPosition = function (A)
{
        var B = A.document;
        var C = {
                X: B.documentElement.scrollLeft,
                Y: B.documentElement.scrollTop
        };
        if (C.X > 0 || C.Y > 0) return C;
        return {
                X: B.body.scrollLeft,
                Y: B.body.scrollTop
        };
};
FCKTools.AddEventListener = function (A, B, C)
{
        A.attachEvent('on' + B, C);
};
FCKTools.RemoveEventListener = function (A, B, C)
{
        A.detachEvent('on' + B, C);
};
FCKTools.AddEventListenerEx = function (A, B, C, D)
{
        var o = {};
        o.Source = A;
        o.Params = D || [];
        o.Listener = function (ev)
        {
                return C.apply(o.Source, [ev].concat(o.Params));
        };
        if (FCK.IECleanup) FCK.IECleanup.AddItem(null, function ()
        {
                o.Source = null;
                o.Params = null;
        });
        A.attachEvent('on' + B, o.Listener);
        A = null;
        D = null;
};
FCKTools.GetViewPaneSize = function (A)
{
        var B;
        var C = A.document.documentElement;
        if (C && C.clientWidth) B = C;
        else B = A.document.body;
        if (B) return {
                Width: B.clientWidth,
                Height: B.clientHeight
        };
        else return {
                Width: 0,
                Height: 0
        };
};
FCKTools.SaveStyles = function (A)
{
        var B = FCKTools.ProtectFormStyles(A);
        var C = {};
        if (A.className.length > 0)
        {
                C.Class = A.className;
                A.className = '';
        };
        var D = A.style.cssText;
        if (D.length > 0)
        {
                C.Inline = D;
                A.style.cssText = '';
        };
        FCKTools.RestoreFormStyles(A, B);
        return C;
};
FCKTools.RestoreStyles = function (A, B)
{
        var C = FCKTools.ProtectFormStyles(A);
        A.className = B.Class || '';
        A.style.cssText = B.Inline || '';
        FCKTools.RestoreFormStyles(A, C);
};
FCKTools.RegisterDollarFunction = function (A)
{
        A.$ = A.document.getElementById;
};
FCKTools.AppendElement = function (A, B)
{
        return A.appendChild(this.GetElementDocument(A).createElement(B));
};
FCKTools.ToLowerCase = function (A)
{
        return A.toLowerCase();
};
var FCKeditorAPI;

function InitializeAPI()
{
        var A = window.parent;
        if (!(FCKeditorAPI = A.FCKeditorAPI))
        {
                var B = 'window.FCKeditorAPI = {Version : "2.6.6",VersionBuild : "25427",Instances : window.FCKeditorAPI && window.FCKeditorAPI.Instances || {},GetInstance : function( name ){return this.Instances[ name ];},_FormSubmit : function(){for ( var name in FCKeditorAPI.Instances ){var oEditor = FCKeditorAPI.Instances[ name ] ;if ( oEditor.GetParentForm && oEditor.GetParentForm() == this )oEditor.UpdateLinkedField() ;}this._FCKOriginalSubmit() ;},_FunctionQueue	: window.FCKeditorAPI && window.FCKeditorAPI._FunctionQueue || {Functions : new Array(),IsRunning : false,Add : function( f ){this.Functions.push( f );if ( !this.IsRunning )this.StartNext();},StartNext : function(){var aQueue = this.Functions ;if ( aQueue.length > 0 ){this.IsRunning = true;aQueue[0].call();}else this.IsRunning = false;},Remove : function( f ){var aQueue = this.Functions;var i = 0, fFunc;while( (fFunc = aQueue[ i ]) ){if ( fFunc == f )aQueue.splice( i,1 );i++ ;}this.StartNext();}}}';
                if (A.execScript) A.execScript(B, 'JavaScript');
                else
                {
                        if (FCKBrowserInfo.IsGecko10)
                        {
                                eval.call(A, B);
                        }
                        else if (FCKBrowserInfo.IsAIR)
                        {
                                FCKAdobeAIR.FCKeditorAPI_Evaluate(A, B);
                        }
                        else if (FCKBrowserInfo.IsSafari)
                        {
                                var C = A.document;
                                var D = C.createElement('script');
                                D.appendChild(C.createTextNode(B));
                                C.documentElement.appendChild(D);
                        }
                        else A.eval(B);
                };
                FCKeditorAPI = A.FCKeditorAPI;
                FCKeditorAPI.__Instances = FCKeditorAPI.Instances;
        };
        FCKeditorAPI.Instances[FCK.Name] = FCK;
};

function _AttachFormSubmitToAPI()
{
        var A = FCK.GetParentForm();
        if (A)
        {
                FCKTools.AddEventListener(A, 'submit', FCK.UpdateLinkedField);
                if (!A._FCKOriginalSubmit && (typeof (A.submit) == 'function' || (!A.submit.tagName && !A.submit.length)))
                {
                        A._FCKOriginalSubmit = A.submit;
                        A.submit = FCKeditorAPI._FormSubmit;
                }
        }
};

function FCKeditorAPI_Cleanup()
{
        if (window.FCKConfig && FCKConfig.MsWebBrowserControlCompat && !window.FCKUnloadFlag) return;
        delete FCKeditorAPI.Instances[FCK.Name];
};

function FCKeditorAPI_ConfirmCleanup()
{
        if (window.FCKConfig && FCKConfig.MsWebBrowserControlCompat) window.FCKUnloadFlag = true;
};
FCKTools.AddEventListener(window, 'unload', FCKeditorAPI_Cleanup);
FCKTools.AddEventListener(window, 'beforeunload', FCKeditorAPI_ConfirmCleanup);
var FCKImagePreloader = function ()
        {
                this._Images = [];
        };
FCKImagePreloader.prototype = {
        AddImages: function (A)
        {
                if (typeof (A) == 'string') A = A.split(';');
                this._Images = this._Images.concat(A);
        },
        Start: function ()
        {
                var A = this._Images;
                this._PreloadCount = A.length;
                for (var i = 0; i < A.length; i++)
                {
                        var B = document.createElement('img');
                        FCKTools.AddEventListenerEx(B, 'load', _FCKImagePreloader_OnImage, this);
                        FCKTools.AddEventListenerEx(B, 'error', _FCKImagePreloader_OnImage, this);
                        B.src = A[i];
                        _FCKImagePreloader_ImageCache.push(B);
                }
        }
};
var _FCKImagePreloader_ImageCache = [];

function _FCKImagePreloader_OnImage(A, B)
{
        if ((--B._PreloadCount) == 0 && B.OnComplete) B.OnComplete();
};
var FCKRegexLib = {
        AposEntity: /&apos;/gi,
        ObjectElements: /^(?:IMG|TABLE|TR|TD|TH|INPUT|SELECT|TEXTAREA|HR|OBJECT|A|UL|OL|LI)$/i,
        NamedCommands: /^(?:Cut|Copy|Paste|Print|SelectAll|RemoveFormat|Unlink|Undo|Redo|Bold|Italic|Underline|StrikeThrough|Subscript|Superscript|JustifyLeft|JustifyCenter|JustifyRight|JustifyFull|Outdent|Indent|InsertOrderedList|InsertUnorderedList|InsertHorizontalRule)$/i,
        BeforeBody: /(^[\s\S]*\<body[^\>]*\>)/i,
        AfterBody: /(\<\/body\>[\s\S]*$)/i,
        ToReplace: /___fcktoreplace:([\w]+)/ig,
        MetaHttpEquiv: /http-equiv\s*=\s*["']?([^"' ]+)/i,
        HasBaseTag: /<base /i,
        HasBodyTag: /<body[\s|>]/i,
        HtmlOpener: /<html\s?[^>]*>/i,
        HeadOpener: /<head\s?[^>]*>/i,
        HeadCloser: /<\/head\s*>/i,
        FCK_Class: /\s*FCK__[^ ]*(?=\s+|$)/,
        ElementName: /(^[a-z_:][\w.\-:]*\w$)|(^[a-z_]$)/,
        ForceSimpleAmpersand: /___FCKAmp___/g,
        SpaceNoClose: /\/>/g,
        EmptyParagraph: /^<(p|div|address|h\d|center)(?=[ >])[^>]*>\s*(<\/\1>)?$/,
        EmptyOutParagraph: /^<(p|div|address|h\d|center)(?=[ >])[^>]*>(?:\s*|&nbsp;|&#160;)(<\/\1>)?$/,
        TagBody: /></,
        GeckoEntitiesMarker: /#\?-\:/g,
        ProtectUrlsImg: /<img(?=\s).*?\ssrc=((?:(?:\s*)("|').*?\2)|(?:[^"'][^ >]+))/gi,
        ProtectUrlsA: /<a(?=\s).*?\shref=((?:(?:\s*)("|').*?\2)|(?:[^"'][^ >]+))/gi,
        ProtectUrlsArea: /<area(?=\s).*?\shref=((?:(?:\s*)("|').*?\2)|(?:[^"'][^ >]+))/gi,
        Html4DocType: /HTML 4\.0 Transitional/i,
        DocTypeTag: /<!DOCTYPE[^>]*>/i,
        HtmlDocType: /DTD HTML/,
        TagsWithEvent: /<[^\>]+ on\w+[\s\r\n]*=[\s\r\n]*?('|")[\s\S]+?\>/g,
        EventAttributes: /\s(on\w+)[\s\r\n]*=[\s\r\n]*?('|")([\s\S]*?)\2/g,
        ProtectedEvents: /\s\w+_fckprotectedatt="([^"]+)"/g,
        StyleProperties: /\S+\s*:/g,
        InvalidSelfCloseTags: /(<(?!base|meta|link|hr|br|param|img|area|input)([a-zA-Z0-9:]+)[^>]*)\/>/gi,
        StyleVariableAttName: /#\(\s*("|')(.+?)\1[^\)]*\s*\)/g,
        RegExp: /^\/(.*)\/([gim]*)$/,
        HtmlTag: /<[^\s<>](?:"[^"]*"|'[^']*'|[^<])*>/
};
var FCKListsLib = {
        BlockElements: {
                address: 1,
                blockquote: 1,
                center: 1,
                div: 1,
                dl: 1,
                fieldset: 1,
                form: 1,
                h1: 1,
                h2: 1,
                h3: 1,
                h4: 1,
                h5: 1,
                h6: 1,
                hr: 1,
                marquee: 1,
                noscript: 1,
                ol: 1,
                p: 1,
                pre: 1,
                script: 1,
                table: 1,
                ul: 1
        },
        NonEmptyBlockElements: {
                p: 1,
                div: 1,
                form: 1,
                h1: 1,
                h2: 1,
                h3: 1,
                h4: 1,
                h5: 1,
                h6: 1,
                address: 1,
                pre: 1,
                ol: 1,
                ul: 1,
                li: 1,
                td: 1,
                th: 1
        },
        InlineChildReqElements: {
                abbr: 1,
                acronym: 1,
                b: 1,
                bdo: 1,
                big: 1,
                cite: 1,
                code: 1,
                del: 1,
                dfn: 1,
                em: 1,
                font: 1,
                i: 1,
                ins: 1,
                label: 1,
                kbd: 1,
                q: 1,
                samp: 1,
                small: 1,
                span: 1,
                strike: 1,
                strong: 1,
                sub: 1,
                sup: 1,
                tt: 1,
                u: 1,
                'var': 1
        },
        InlineNonEmptyElements: {
                a: 1,
                abbr: 1,
                acronym: 1,
                b: 1,
                bdo: 1,
                big: 1,
                cite: 1,
                code: 1,
                del: 1,
                dfn: 1,
                em: 1,
                font: 1,
                i: 1,
                ins: 1,
                label: 1,
                kbd: 1,
                q: 1,
                samp: 1,
                small: 1,
                span: 1,
                strike: 1,
                strong: 1,
                sub: 1,
                sup: 1,
                tt: 1,
                u: 1,
                'var': 1
        },
        EmptyElements: {
                base: 1,
                col: 1,
                meta: 1,
                link: 1,
                hr: 1,
                br: 1,
                param: 1,
                img: 1,
                area: 1,
                input: 1
        },
        PathBlockElements: {
                address: 1,
                blockquote: 1,
                dl: 1,
                h1: 1,
                h2: 1,
                h3: 1,
                h4: 1,
                h5: 1,
                h6: 1,
                p: 1,
                pre: 1,
                li: 1,
                dt: 1,
                de: 1
        },
        PathBlockLimitElements: {
                body: 1,
                div: 1,
                td: 1,
                th: 1,
                caption: 1,
                form: 1
        },
        StyleBlockElements: {
                address: 1,
                div: 1,
                h1: 1,
                h2: 1,
                h3: 1,
                h4: 1,
                h5: 1,
                h6: 1,
                p: 1,
                pre: 1
        },
        StyleObjectElements: {
                img: 1,
                hr: 1,
                li: 1,
                table: 1,
                tr: 1,
                td: 1,
                embed: 1,
                object: 1,
                ol: 1,
                ul: 1
        },
        NonEditableElements: {
                button: 1,
                option: 1,
                script: 1,
                iframe: 1,
                textarea: 1,
                object: 1,
                embed: 1,
                map: 1,
                applet: 1
        },
        BlockBoundaries: {
                p: 1,
                div: 1,
                h1: 1,
                h2: 1,
                h3: 1,
                h4: 1,
                h5: 1,
                h6: 1,
                hr: 1,
                address: 1,
                pre: 1,
                ol: 1,
                ul: 1,
                li: 1,
                dt: 1,
                de: 1,
                table: 1,
                thead: 1,
                tbody: 1,
                tfoot: 1,
                tr: 1,
                th: 1,
                td: 1,
                caption: 1,
                col: 1,
                colgroup: 1,
                blockquote: 1,
                body: 1
        },
        ListBoundaries: {
                p: 1,
                div: 1,
                h1: 1,
                h2: 1,
                h3: 1,
                h4: 1,
                h5: 1,
                h6: 1,
                hr: 1,
                address: 1,
                pre: 1,
                ol: 1,
                ul: 1,
                li: 1,
                dt: 1,
                de: 1,
                table: 1,
                thead: 1,
                tbody: 1,
                tfoot: 1,
                tr: 1,
                th: 1,
                td: 1,
                caption: 1,
                col: 1,
                colgroup: 1,
                blockquote: 1,
                body: 1,
                br: 1
        }
};
var FCKLanguageManager = FCK.Language = {
        AvailableLanguages: {
                af: 'Afrikaans',
                ar: 'Arabic',
                bg: 'Bulgarian',
                bn: 'Bengali/Bangla',
                bs: 'Bosnian',
                ca: 'Catalan',
                cs: 'Czech',
                da: 'Danish',
                de: 'German',
                el: 'Greek',
                en: 'English',
                'en-au': 'English (Australia)',
                'en-ca': 'English (Canadian)',
                'en-uk': 'English (United Kingdom)',
                eo: 'Esperanto',
                es: 'Spanish',
                et: 'Estonian',
                eu: 'Basque',
                fa: 'Persian',
                fi: 'Finnish',
                fo: 'Faroese',
                fr: 'French',
                'fr-ca': 'French (Canada)',
                gl: 'Galician',
                gu: 'Gujarati',
                he: 'Hebrew',
                hi: 'Hindi',
                hr: 'Croatian',
                hu: 'Hungarian',
                is: 'Icelandic',
                it: 'Italian',
                ja: 'Japanese',
                km: 'Khmer',
                ko: 'Korean',
                lt: 'Lithuanian',
                lv: 'Latvian',
                mn: 'Mongolian',
                ms: 'Malay',
                nb: 'Norwegian Bokmal',
                nl: 'Dutch',
                no: 'Norwegian',
                pl: 'Polish',
                pt: 'Portuguese (Portugal)',
                'pt-br': 'Portuguese (Brazil)',
                ro: 'Romanian',
                ru: 'Russian',
                sk: 'Slovak',
                sl: 'Slovenian',
                sr: 'Serbian (Cyrillic)',
                'sr-latn': 'Serbian (Latin)',
                sv: 'Swedish',
                th: 'Thai',
                tr: 'Turkish',
                uk: 'Ukrainian',
                vi: 'Vietnamese',
                zh: 'Chinese Traditional',
                'zh-cn': 'Chinese Simplified'
        },
        GetActiveLanguage: function ()
        {
                if (FCKConfig.AutoDetectLanguage)
                {
                        var A;
                        if (navigator.userLanguage) A = navigator.userLanguage.toLowerCase();
                        else if (navigator.language) A = navigator.language.toLowerCase();
                        else
                        {
                                return FCKConfig.DefaultLanguage;
                        };
                        if (A.length >= 5)
                        {
                                A = A.substr(0, 5);
                                if (this.AvailableLanguages[A]) return A;
                        };
                        if (A.length >= 2)
                        {
                                A = A.substr(0, 2);
                                if (this.AvailableLanguages[A]) return A;
                        }
                };
                return this.DefaultLanguage;
        },
        TranslateElements: function (A, B, C, D)
        {
                var e = A.getElementsByTagName(B);
                var E, s;
                for (var i = 0; i < e.length; i++)
                {
                        if ((E = e[i].getAttribute('fckLang')))
                        {
                                if ((s = FCKLang[E]))
                                {
                                        if (D) s = FCKTools.HTMLEncode(s);
                                        e[i][C] = s;
                                }
                        }
                }
        },
        TranslatePage: function (A)
        {
                this.TranslateElements(A, 'INPUT', 'value');
                this.TranslateElements(A, 'SPAN', 'innerHTML');
                this.TranslateElements(A, 'LABEL', 'innerHTML');
                this.TranslateElements(A, 'OPTION', 'innerHTML', true);
                this.TranslateElements(A, 'LEGEND', 'innerHTML');
        },
        Initialize: function ()
        {
                if (this.AvailableLanguages[FCKConfig.DefaultLanguage]) this.DefaultLanguage = FCKConfig.DefaultLanguage;
                else this.DefaultLanguage = 'en';
                this.ActiveLanguage = {};
                this.ActiveLanguage.Code = this.GetActiveLanguage();
                this.ActiveLanguage.Name = this.AvailableLanguages[this.ActiveLanguage.Code];
        }
};
var FCKXHtmlEntities = {};
FCKXHtmlEntities.Initialize = function ()
{
        if (FCKXHtmlEntities.Entities) return;
        var A = '';
        var B, e;
        if (FCKConfig.ProcessHTMLEntities)
        {
                FCKXHtmlEntities.Entities = {
                        ' ': 'nbsp',
                        '¡': 'iexcl',
                        '¢': 'cent',
                        '£': 'pound',
                        '¤': 'curren',
                        '¥': 'yen',
                        '¦': 'brvbar',
                        '§': 'sect',
                        '¨': 'uml',
                        '©': 'copy',
                        'ª': 'ordf',
                        '«': 'laquo',
                        '¬': 'not',
                        '­': 'shy',
                        '®': 'reg',
                        '¯': 'macr',
                        '°': 'deg',
                        '±': 'plusmn',
                        '²': 'sup2',
                        '³': 'sup3',
                        '´': 'acute',
                        'µ': 'micro',
                        '¶': 'para',
                        '·': 'middot',
                        '¸': 'cedil',
                        '¹': 'sup1',
                        'º': 'ordm',
                        '»': 'raquo',
                        '¼': 'frac14',
                        '½': 'frac12',
                        '¾': 'frac34',
                        '¿': 'iquest',
                        '×': 'times',
                        '÷': 'divide',
                        'ƒ': 'fnof',
                        '•': 'bull',
                        '…': 'hellip',
                        '′': 'prime',
                        '″': 'Prime',
                        '‾': 'oline',
                        '⁄': 'frasl',
                        '℘': 'weierp',
                        'ℑ': 'image',
                        'ℜ': 'real',
                        '™': 'trade',
                        'ℵ': 'alefsym',
                        '←': 'larr',
                        '↑': 'uarr',
                        '→': 'rarr',
                        '↓': 'darr',
                        '↔': 'harr',
                        '↵': 'crarr',
                        '⇐': 'lArr',
                        '⇑': 'uArr',
                        '⇒': 'rArr',
                        '⇓': 'dArr',
                        '⇔': 'hArr',
                        '∀': 'forall',
                        '∂': 'part',
                        '∃': 'exist',
                        '∅': 'empty',
                        '∇': 'nabla',
                        '∈': 'isin',
                        '∉': 'notin',
                        '∋': 'ni',
                        '∏': 'prod',
                        '∑': 'sum',
                        '−': 'minus',
                        '∗': 'lowast',
                        '√': 'radic',
                        '∝': 'prop',
                        '∞': 'infin',
                        '∠': 'ang',
                        '∧': 'and',
                        '∨': 'or',
                        '∩': 'cap',
                        '∪': 'cup',
                        '∫': 'int',
                        '∴': 'there4',
                        '∼': 'sim',
                        '≅': 'cong',
                        '≈': 'asymp',
                        '≠': 'ne',
                        '≡': 'equiv',
                        '≤': 'le',
                        '≥': 'ge',
                        '⊂': 'sub',
                        '⊃': 'sup',
                        '⊄': 'nsub',
                        '⊆': 'sube',
                        '⊇': 'supe',
                        '⊕': 'oplus',
                        '⊗': 'otimes',
                        '⊥': 'perp',
                        '⋅': 'sdot',
                        '\u2308': 'lceil',
                        '\u2309': 'rceil',
                        '\u230a': 'lfloor',
                        '\u230b': 'rfloor',
                        '\u2329': 'lang',
                        '\u232a': 'rang',
                        '◊': 'loz',
                        '♠': 'spades',
                        '♣': 'clubs',
                        '♥': 'hearts',
                        '♦': 'diams',
                        '"': 'quot',
                        '>': 'gt',
                        'ˆ': 'circ',
                        '˜': 'tilde',
                        ' ': 'ensp',
                        ' ': 'emsp',
                        ' ': 'thinsp',
                        '‌': 'zwnj',
                        '‍': 'zwj',
                        '‎': 'lrm',
                        '‏': 'rlm',
                        '–': 'ndash',
                        '—': 'mdash',
                        '‘': 'lsquo',
                        '’': 'rsquo',
                        '‚': 'sbquo',
                        '“': 'ldquo',
                        '”': 'rdquo',
                        '„': 'bdquo',
                        '†': 'dagger',
                        '‡': 'Dagger',
                        '‰': 'permil',
                        '‹': 'lsaquo',
                        '›': 'rsaquo',
                        '€': 'euro'
                };
                for (e in FCKXHtmlEntities.Entities) A += e;
                if (FCKConfig.IncludeLatinEntities)
                {
                        B = {
                                'À': 'Agrave',
                                'Á': 'Aacute',
                                'Â': 'Acirc',
                                'Ã': 'Atilde',
                                'Ä': 'Auml',
                                'Å': 'Aring',
                                'Æ': 'AElig',
                                'Ç': 'Ccedil',
                                'È': 'Egrave',
                                'É': 'Eacute',
                                'Ê': 'Ecirc',
                                'Ë': 'Euml',
                                'Ì': 'Igrave',
                                'Í': 'Iacute',
                                'Î': 'Icirc',
                                'Ï': 'Iuml',
                                'Ð': 'ETH',
                                'Ñ': 'Ntilde',
                                'Ò': 'Ograve',
                                'Ó': 'Oacute',
                                'Ô': 'Ocirc',
                                'Õ': 'Otilde',
                                'Ö': 'Ouml',
                                'Ø': 'Oslash',
                                'Ù': 'Ugrave',
                                'Ú': 'Uacute',
                                'Û': 'Ucirc',
                                'Ü': 'Uuml',
                                'Ý': 'Yacute',
                                'Þ': 'THORN',
                                'ß': 'szlig',
                                'à': 'agrave',
                                'á': 'aacute',
                                'â': 'acirc',
                                'ã': 'atilde',
                                'ä': 'auml',
                                'å': 'aring',
                                'æ': 'aelig',
                                'ç': 'ccedil',
                                'è': 'egrave',
                                'é': 'eacute',
                                'ê': 'ecirc',
                                'ë': 'euml',
                                'ì': 'igrave',
                                'í': 'iacute',
                                'î': 'icirc',
                                'ï': 'iuml',
                                'ð': 'eth',
                                'ñ': 'ntilde',
                                'ò': 'ograve',
                                'ó': 'oacute',
                                'ô': 'ocirc',
                                'õ': 'otilde',
                                'ö': 'ouml',
                                'ø': 'oslash',
                                'ù': 'ugrave',
                                'ú': 'uacute',
                                'û': 'ucirc',
                                'ü': 'uuml',
                                'ý': 'yacute',
                                'þ': 'thorn',
                                'ÿ': 'yuml',
                                'Œ': 'OElig',
                                'œ': 'oelig',
                                'Š': 'Scaron',
                                'š': 'scaron',
                                'Ÿ': 'Yuml'
                        };
                        for (e in B)
                        {
                                FCKXHtmlEntities.Entities[e] = B[e];
                                A += e;
                        };
                        B = null;
                };
                if (FCKConfig.IncludeGreekEntities)
                {
                        B = {
                                'Α': 'Alpha',
                                'Β': 'Beta',
                                'Γ': 'Gamma',
                                'Δ': 'Delta',
                                'Ε': 'Epsilon',
                                'Ζ': 'Zeta',
                                'Η': 'Eta',
                                'Θ': 'Theta',
                                'Ι': 'Iota',
                                'Κ': 'Kappa',
                                'Λ': 'Lambda',
                                'Μ': 'Mu',
                                'Ν': 'Nu',
                                'Ξ': 'Xi',
                                'Ο': 'Omicron',
                                'Π': 'Pi',
                                'Ρ': 'Rho',
                                'Σ': 'Sigma',
                                'Τ': 'Tau',
                                'Υ': 'Upsilon',
                                'Φ': 'Phi',
                                'Χ': 'Chi',
                                'Ψ': 'Psi',
                                'Ω': 'Omega',
                                'α': 'alpha',
                                'β': 'beta',
                                'γ': 'gamma',
                                'δ': 'delta',
                                'ε': 'epsilon',
                                'ζ': 'zeta',
                                'η': 'eta',
                                'θ': 'theta',
                                'ι': 'iota',
                                'κ': 'kappa',
                                'λ': 'lambda',
                                'μ': 'mu',
                                'ν': 'nu',
                                'ξ': 'xi',
                                'ο': 'omicron',
                                'π': 'pi',
                                'ρ': 'rho',
                                'ς': 'sigmaf',
                                'σ': 'sigma',
                                'τ': 'tau',
                                'υ': 'upsilon',
                                'φ': 'phi',
                                'χ': 'chi',
                                'ψ': 'psi',
                                'ω': 'omega',
                                '\u03d1': 'thetasym',
                                '\u03d2': 'upsih',
                                '\u03d6': 'piv'
                        };
                        for (e in B)
                        {
                                FCKXHtmlEntities.Entities[e] = B[e];
                                A += e;
                        };
                        B = null;
                }
        }
        else
        {
                FCKXHtmlEntities.Entities = {
                        '>': 'gt'
                };
                A = '>';
                A += ' ';
        };
        var C = '[' + A + ']';
        if (FCKConfig.ProcessNumericEntities) C = '[^ -~]|' + C;
        var D = FCKConfig.AdditionalNumericEntities;
        if (D && D.length > 0) C += '|' + FCKConfig.AdditionalNumericEntities;
        FCKXHtmlEntities.EntitiesRegex = new RegExp(C, 'g');
};
var FCKXHtml = {};
FCKXHtml.CurrentJobNum = 0;
FCKXHtml.GetXHTML = function (A, B, C)
{
        FCKDomTools.CheckAndRemovePaddingNode(FCKTools.GetElementDocument(A), FCKConfig.EnterMode);
        FCKXHtmlEntities.Initialize();
        this._NbspEntity = (FCKConfig.ProcessHTMLEntities ? 'nbsp' : '#160');
        var D = FCK.IsDirty();
        FCKXHtml.SpecialBlocks = [];
        this.XML = FCKTools.CreateXmlObject('DOMDocument');
        this.MainNode = this.XML.appendChild(this.XML.createElement('xhtml'));
        FCKXHtml.CurrentJobNum++;
        if (B) this._AppendNode(this.MainNode, A);
        else this._AppendChildNodes(this.MainNode, A, false);
        if (FCKBrowserInfo.IsIE) FCKXHtml._RemoveXHtmlJobProperties(A);
        var E = this._GetMainXmlString();
        this.XML = null;
        if (FCKBrowserInfo.IsSafari) E = E.replace(/^<xhtml.*?>/, '<xhtml>');
        E = E.substr(7, E.length - 15).Trim();
        if (FCKConfig.DocType.length > 0 && FCKRegexLib.HtmlDocType.test(FCKConfig.DocType)) E = E.replace(FCKRegexLib.SpaceNoClose, '>');
        else E = E.replace(FCKRegexLib.SpaceNoClose, ' />');
        if (FCKConfig.ForceSimpleAmpersand) E = E.replace(FCKRegexLib.ForceSimpleAmpersand, '&');
        if (C) E = FCKCodeFormatter.Format(E);
        for (var i = 0; i < FCKXHtml.SpecialBlocks.length; i++)
        {
                var F = new RegExp('___FCKsi___' + i);
                E = E.replace(F, FCKXHtml.SpecialBlocks[i]);
        };
        E = E.replace(FCKRegexLib.GeckoEntitiesMarker, '&');
        if (!D) FCK.ResetIsDirty();
        FCKDomTools.EnforcePaddingNode(FCKTools.GetElementDocument(A), FCKConfig.EnterMode);
        return E;
};
FCKXHtml._AppendAttribute = function (A, B, C)
{
        try
        {
                if (C == undefined || C == null) C = '';
                else if (C.replace)
                {
                        if (FCKConfig.ForceSimpleAmpersand) C = C.replace(/&/g, '___FCKAmp___');
                        C = C.replace(FCKXHtmlEntities.EntitiesRegex, FCKXHtml_GetEntity);
                };
                var D = this.XML.createAttribute(B);
                D.value = C;
                A.attributes.setNamedItem(D);
        }
        catch (e)
        {}
};
FCKXHtml._AppendChildNodes = function (A, B, C)
{
        var D = B.firstChild;
        while (D)
        {
                this._AppendNode(A, D);
                D = D.nextSibling;
        };
        if (C && B.tagName && B.tagName.toLowerCase() != 'pre')
        {
                FCKDomTools.TrimNode(A);
                if (FCKConfig.FillEmptyBlocks)
                {
                        var E = A.lastChild;
                        if (E && E.nodeType == 1 && E.nodeName == 'br') this._AppendEntity(A, this._NbspEntity);
                }
        };
        if (A.childNodes.length == 0)
        {
                if (C && FCKConfig.FillEmptyBlocks)
                {
                        this._AppendEntity(A, this._NbspEntity);
                        return A;
                };
                var F = A.nodeName;
                if (FCKListsLib.InlineChildReqElements[F]) return null;
                if (!FCKListsLib.EmptyElements[F]) A.appendChild(this.XML.createTextNode(''));
        };
        return A;
};
FCKXHtml._AppendNode = function (A, B)
{
        if (!B) return false;
        switch (B.nodeType)
        {
        case 1:
                if (FCKBrowserInfo.IsGecko && B.tagName.toLowerCase() == 'br' && B.parentNode.tagName.toLowerCase() == 'pre')
                {
                        var C = '\r';
                        if (B == B.parentNode.firstChild) C += '\r';
                        return FCKXHtml._AppendNode(A, this.XML.createTextNode(C));
                };
                if (B.getAttribute('_fckfakelement')) return FCKXHtml._AppendNode(A, FCK.GetRealElement(B));
                if (FCKBrowserInfo.IsGecko && (B.hasAttribute('_moz_editor_bogus_node') || B.getAttribute('type') == '_moz'))
                {
                        if (B.nextSibling) return false;
                        else
                        {
                                B.removeAttribute('_moz_editor_bogus_node');
                                B.removeAttribute('type');
                        }
                };
                if (B.getAttribute('_fcktemp')) return false;
                var D = B.tagName.toLowerCase();
                if (FCKBrowserInfo.IsIE)
                {
                        if (B.scopeName && B.scopeName != 'HTML' && B.scopeName != 'FCK') D = B.scopeName.toLowerCase() + ':' + D;
                }
                else
                {
                        if (D.StartsWith('fck:')) D = D.Remove(0, 4);
                };
                if (!FCKRegexLib.ElementName.test(D)) return false;
                if (B._fckxhtmljob && B._fckxhtmljob == FCKXHtml.CurrentJobNum) return false;
                var E = this.XML.createElement(D);
                FCKXHtml._AppendAttributes(A, B, E, D);
                B._fckxhtmljob = FCKXHtml.CurrentJobNum;
                var F = FCKXHtml.TagProcessors[D];
                if (F) E = F(E, B, A);
                else E = this._AppendChildNodes(E, B, Boolean(FCKListsLib.NonEmptyBlockElements[D]));
                if (!E) return false;
                A.appendChild(E);
                break;
        case 3:
                if (B.parentNode && B.parentNode.nodeName.IEquals('pre')) return this._AppendTextNode(A, B.nodeValue);
                return this._AppendTextNode(A, B.nodeValue.ReplaceNewLineChars(' '));
        case 8:
                if (FCKBrowserInfo.IsIE && !B.innerHTML) break;
                try
                {
                        A.appendChild(this.XML.createComment(B.nodeValue));
                }
                catch (e)
                {};
                break;
        default:
                A.appendChild(this.XML.createComment("Element not supported - Type: " + B.nodeType + " Name: " + B.nodeName));
                break;
        };
        return true;
};
FCKXHtml._AppendSpecialItem = function (A)
{
        return '___FCKsi___' + (FCKXHtml.SpecialBlocks.push(A) - 1);
};
FCKXHtml._AppendEntity = function (A, B)
{
        A.appendChild(this.XML.createTextNode('#?-:' + B + ';'));
};
FCKXHtml._AppendTextNode = function (A, B)
{
        var C = B.length > 0;
        if (C) A.appendChild(this.XML.createTextNode(B.replace(FCKXHtmlEntities.EntitiesRegex, FCKXHtml_GetEntity)));
        return C;
};

function FCKXHtml_GetEntity(A)
{
        var B = FCKXHtmlEntities.Entities[A] || ('#' + A.charCodeAt(0));
        return '#?-:' + B + ';';
};
FCKXHtml.TagProcessors = {
        a: function (A, B)
        {
                if (B.innerHTML.Trim().length == 0 && !B.name) return false;
                var C = B.getAttribute('_fcksavedurl');
                if (C != null) FCKXHtml._AppendAttribute(A, 'href', C);
                if (FCKBrowserInfo.IsIE)
                {
                        if (B.name) FCKXHtml._AppendAttribute(A, 'name', B.name);
                };
                A = FCKXHtml._AppendChildNodes(A, B, false);
                return A;
        },
        area: function (A, B)
        {
                var C = B.getAttribute('_fcksavedurl');
                if (C != null) FCKXHtml._AppendAttribute(A, 'href', C);
                if (FCKBrowserInfo.IsIE)
                {
                        if (!A.attributes.getNamedItem('coords'))
                        {
                                var D = B.getAttribute('coords', 2);
                                if (D && D != '0,0,0') FCKXHtml._AppendAttribute(A, 'coords', D);
                        };
                        if (!A.attributes.getNamedItem('shape'))
                        {
                                var E = B.getAttribute('shape', 2);
                                if (E && E.length > 0) FCKXHtml._AppendAttribute(A, 'shape', E.toLowerCase());
                        }
                };
                return A;
        },
        body: function (A, B)
        {
                A = FCKXHtml._AppendChildNodes(A, B, false);
                A.removeAttribute('spellcheck');
                return A;
        },
        iframe: function (A, B)
        {
                var C = B.innerHTML;
                if (FCKBrowserInfo.IsGecko) C = FCKTools.HTMLDecode(C);
                C = C.replace(/\s_fcksavedurl="[^"]*"/g, '');
                A.appendChild(FCKXHtml.XML.createTextNode(FCKXHtml._AppendSpecialItem(C)));
                return A;
        },
        img: function (A, B)
        {
                if (!A.attributes.getNamedItem('alt')) FCKXHtml._AppendAttribute(A, 'alt', '');
                var C = B.getAttribute('_fcksavedurl');
                if (C != null) FCKXHtml._AppendAttribute(A, 'src', C);
                if (B.style.width) A.removeAttribute('width');
                if (B.style.height) A.removeAttribute('height');
                return A;
        },
        li: function (A, B, C)
        {
                if (C.nodeName.IEquals(['ul', 'ol'])) return FCKXHtml._AppendChildNodes(A, B, true);
                var D = FCKXHtml.XML.createElement('ul');
                B._fckxhtmljob = null;
                do
                {
                        FCKXHtml._AppendNode(D, B);
                        do
                        {
                                B = FCKDomTools.GetNextSibling(B);
                        } while (B && B.nodeType == 3 && B.nodeValue.Trim().length == 0)
                } while (B && B.nodeName.toLowerCase() == 'li') return D;
        },
        ol: function (A, B, C)
        {
                if (B.innerHTML.Trim().length == 0) return false;
                var D = C.lastChild;
                if (D && D.nodeType == 3) D = D.previousSibling;
                if (D && D.nodeName.toUpperCase() == 'LI')
                {
                        B._fckxhtmljob = null;
                        FCKXHtml._AppendNode(D, B);
                        return false;
                };
                A = FCKXHtml._AppendChildNodes(A, B);
                return A;
        },
        pre: function (A, B)
        {
                var C = B.firstChild;
                if (C && C.nodeType == 3) A.appendChild(FCKXHtml.XML.createTextNode(FCKXHtml._AppendSpecialItem('\r\n')));
                FCKXHtml._AppendChildNodes(A, B, true);
                return A;
        },
        script: function (A, B)
        {
                if (!A.attributes.getNamedItem('type')) FCKXHtml._AppendAttribute(A, 'type', 'text/javascript');
                A.appendChild(FCKXHtml.XML.createTextNode(FCKXHtml._AppendSpecialItem(B.text)));
                return A;
        },
        span: function (A, B)
        {
                if (B.innerHTML.length == 0) return false;
                A = FCKXHtml._AppendChildNodes(A, B, false);
                return A;
        },
        style: function (A, B)
        {
                if (!A.attributes.getNamedItem('type')) FCKXHtml._AppendAttribute(A, 'type', 'text/css');
                var C = B.innerHTML;
                if (FCKBrowserInfo.IsIE) C = C.replace(/^(\r\n|\n|\r)/, '');
                A.appendChild(FCKXHtml.XML.createTextNode(FCKXHtml._AppendSpecialItem(C)));
                return A;
        },
        title: function (A, B)
        {
                A.appendChild(FCKXHtml.XML.createTextNode(FCK.EditorDocument.title));
                return A;
        }
};
FCKXHtml.TagProcessors.ul = FCKXHtml.TagProcessors.ol;
FCKXHtml._GetMainXmlString = function ()
{
        return this.MainNode.xml;
};
FCKXHtml._AppendAttributes = function (A, B, C, D)
{
        var E = B.attributes,
                bHasStyle;
        for (var n = 0; n < E.length; n++)
        {
                var F = E[n];
                if (F.specified)
                {
                        var G = F.nodeName.toLowerCase();
                        var H;
                        if (G.StartsWith('_fck')) continue;
                        else if (G == 'style')
                        {
                                bHasStyle = true;
                                continue;
                        }
                        else if (G == 'class')
                        {
                                H = F.nodeValue.replace(FCKRegexLib.FCK_Class, '');
                                if (H.length == 0) continue;
                        }
                        else if (G.indexOf('on') == 0) H = F.nodeValue;
                        else if (D == 'body' && G == 'contenteditable') continue;
                        else if (F.nodeValue === true) H = G;
                        else
                        {
                                try
                                {
                                        H = B.getAttribute(G, 2);
                                }
                                catch (e)
                                {}
                        };
                        this._AppendAttribute(C, G, H || F.nodeValue);
                }
        };
        if (bHasStyle || B.style.cssText.length > 0)
        {
                var I = FCKTools.ProtectFormStyles(B);
                var J = B.style.cssText.replace(FCKRegexLib.StyleProperties, FCKTools.ToLowerCase);
                FCKTools.RestoreFormStyles(B, I);
                this._AppendAttribute(C, 'style', J);
        }
};
FCKXHtml._RemoveXHtmlJobProperties = function (A)
{
        if (!A || !A.nodeType || A.nodeType != 1) return;
        if (typeof A._fckxhtmljob == 'undefined' && A.tagName !== 'BODY') return;
        A.removeAttribute('_fckxhtmljob');
        if (A.hasChildNodes())
        {
                var B = A.childNodes;
                for (var i = B.length - 1; i >= 0; i--)
                {
                        var C = B[i];
                        if (C.parentNode == A) FCKXHtml._RemoveXHtmlJobProperties(C);
                }
        }
};
FCKXHtml.TagProcessors['div'] = function (A, B)
{
        if (B.align.length > 0) FCKXHtml._AppendAttribute(A, 'align', B.align);
        A = FCKXHtml._AppendChildNodes(A, B, true);
        return A;
};
FCKXHtml.TagProcessors['font'] = function (A, B)
{
        if (A.attributes.length == 0) A = FCKXHtml.XML.createDocumentFragment();
        A = FCKXHtml._AppendChildNodes(A, B);
        return A;
};
FCKXHtml.TagProcessors['form'] = function (A, B)
{
        if (B.acceptCharset && B.acceptCharset.length > 0 && B.acceptCharset != 'UNKNOWN') FCKXHtml._AppendAttribute(A, 'accept-charset', B.acceptCharset);
        var C = B.attributes['name'];
        if (C && C.value.length > 0) FCKXHtml._AppendAttribute(A, 'name', C.value);
        A = FCKXHtml._AppendChildNodes(A, B, true);
        return A;
};
FCKXHtml.TagProcessors['input'] = function (A, B)
{
        if (B.name) FCKXHtml._AppendAttribute(A, 'name', B.name);
        if (B.value && !A.attributes.getNamedItem('value')) FCKXHtml._AppendAttribute(A, 'value', B.value);
        if (!A.attributes.getNamedItem('type')) FCKXHtml._AppendAttribute(A, 'type', 'text');
        return A;
};
FCKXHtml.TagProcessors['label'] = function (A, B)
{
        if (B.htmlFor.length > 0) FCKXHtml._AppendAttribute(A, 'for', B.htmlFor);
        A = FCKXHtml._AppendChildNodes(A, B);
        return A;
};
FCKXHtml.TagProcessors['map'] = function (A, B)
{
        if (!A.attributes.getNamedItem('name'))
        {
                var C = B.name;
                if (C) FCKXHtml._AppendAttribute(A, 'name', C);
        };
        A = FCKXHtml._AppendChildNodes(A, B, true);
        return A;
};
FCKXHtml.TagProcessors['meta'] = function (A, B)
{
        var C = A.attributes.getNamedItem('http-equiv');
        if (C == null || C.value.length == 0)
        {
                var D = B.outerHTML.match(FCKRegexLib.MetaHttpEquiv);
                if (D)
                {
                        D = D[1];
                        FCKXHtml._AppendAttribute(A, 'http-equiv', D);
                }
        };
        return A;
};
FCKXHtml.TagProcessors['option'] = function (A, B)
{
        if (B.selected && !A.attributes.getNamedItem('selected')) FCKXHtml._AppendAttribute(A, 'selected', 'selected');
        A = FCKXHtml._AppendChildNodes(A, B);
        return A;
};
FCKXHtml.TagProcessors['textarea'] = FCKXHtml.TagProcessors['select'] = function (A, B)
{
        if (B.name) FCKXHtml._AppendAttribute(A, 'name', B.name);
        A = FCKXHtml._AppendChildNodes(A, B);
        return A;
};
var FCKCodeFormatter = {};
FCKCodeFormatter.Init = function ()
{
        var A = this.Regex = {};
        A.BlocksOpener = /\<(P|DIV|H1|H2|H3|H4|H5|H6|ADDRESS|PRE|OL|UL|LI|DL|DT|DD|TITLE|META|LINK|BASE|SCRIPT|LINK|TD|TH|AREA|OPTION)[^\>]*\>/gi;
        A.BlocksCloser = /\<\/(P|DIV|H1|H2|H3|H4|H5|H6|ADDRESS|PRE|OL|UL|LI|DL|DT|DD|TITLE|META|LINK|BASE|SCRIPT|LINK|TD|TH|AREA|OPTION)[^\>]*\>/gi;
        A.NewLineTags = /\<(BR|HR)[^\>]*\>/gi;
        A.MainTags = /\<\/?(HTML|HEAD|BODY|FORM|TABLE|TBODY|THEAD|TR)[^\>]*\>/gi;
        A.LineSplitter = /\s*\n+\s*/g;
        A.IncreaseIndent = /^\<(HTML|HEAD|BODY|FORM|TABLE|TBODY|THEAD|TR|UL|OL|DL)[ \/\>]/i;
        A.DecreaseIndent = /^\<\/(HTML|HEAD|BODY|FORM|TABLE|TBODY|THEAD|TR|UL|OL|DL)[ \>]/i;
        A.FormatIndentatorRemove = new RegExp('^' + FCKConfig.FormatIndentator);
        A.ProtectedTags = /(<PRE[^>]*>)([\s\S]*?)(<\/PRE>)/gi;
};
FCKCodeFormatter._ProtectData = function (A, B, C, D)
{
        return B + '___FCKpd___' + (FCKCodeFormatter.ProtectedData.push(C) - 1) + D;
};
FCKCodeFormatter.Format = function (A)
{
        if (!this.Regex) this.Init();
        FCKCodeFormatter.ProtectedData = [];
        var B = A.replace(this.Regex.ProtectedTags, FCKCodeFormatter._ProtectData);
        B = B.replace(this.Regex.BlocksOpener, '\n$&');
        B = B.replace(this.Regex.BlocksCloser, '$&\n');
        B = B.replace(this.Regex.NewLineTags, '$&\n');
        B = B.replace(this.Regex.MainTags, '\n$&\n');
        var C = '';
        var D = B.split(this.Regex.LineSplitter);
        B = '';
        for (var i = 0; i < D.length; i++)
        {
                var E = D[i];
                if (E.length == 0) continue;
                if (this.Regex.DecreaseIndent.test(E)) C = C.replace(this.Regex.FormatIndentatorRemove, '');
                B += C + E + '\n';
                if (this.Regex.IncreaseIndent.test(E)) C += FCKConfig.FormatIndentator;
        };
        for (var j = 0; j < FCKCodeFormatter.ProtectedData.length; j++)
        {
                var F = new RegExp('___FCKpd___' + j);
                B = B.replace(F, FCKCodeFormatter.ProtectedData[j].replace(/\$/g, '$$$$'));
        };
        return B.Trim();
};
var FCKUndo = {};
FCKUndo.SavedData = [];
FCKUndo.CurrentIndex = -1;
FCKUndo.TypesCount = 0;
FCKUndo.Changed = false;
FCKUndo.MaxTypes = 25;
FCKUndo.Typing = false;
FCKUndo.SaveLocked = false;
FCKUndo._GetBookmark = function ()
{
        FCKSelection.Restore();
        var A = new FCKDomRange(FCK.EditorWindow);
        try
        {
                A.MoveToSelection();
        }
        catch (e)
        {
                return null;
        };
        if (FCKBrowserInfo.IsIE)
        {
                var B = A.CreateBookmark();
                var C = FCK.EditorDocument.body.innerHTML;
                A.MoveToBookmark(B);
                return [B, C];
        };
        return A.CreateBookmark2();
};
FCKUndo._SelectBookmark = function (A)
{
        if (!A) return;
        var B = new FCKDomRange(FCK.EditorWindow);
        if (A instanceof Object)
        {
                if (FCKBrowserInfo.IsIE) B.MoveToBookmark(A[0]);
                else B.MoveToBookmark2(A);
                try
                {
                        B.Select();
                }
                catch (e)
                {
                        B.MoveToPosition(FCK.EditorDocument.body, 4);
                        B.Select();
                }
        }
};
FCKUndo._CompareCursors = function (A, B)
{
        for (var i = 0; i < Math.min(A.length, B.length); i++)
        {
                if (A[i] < B[i]) return -1;
                else if (A[i] > B[i]) return 1;
        };
        if (A.length < B.length) return -1;
        else if (A.length > B.length) return 1;
        return 0;
};
FCKUndo._CheckIsBookmarksEqual = function (A, B)
{
        if (!(A && B)) return false;
        if (FCKBrowserInfo.IsIE)
        {
                var C = A[1].search(A[0].StartId);
                var D = B[1].search(B[0].StartId);
                var E = A[1].search(A[0].EndId);
                var F = B[1].search(B[0].EndId);
                return C == D && E == F;
        }
        else
        {
                return this._CompareCursors(A.Start, B.Start) == 0 && this._CompareCursors(A.End, B.End) == 0;
        }
};
FCKUndo.SaveUndoStep = function ()
{
        if (FCK.EditMode != 0 || this.SaveLocked) return;
        if (this.SavedData.length) this.Changed = true;
        var A = FCK.EditorDocument.body.innerHTML;
        var B = this._GetBookmark();
        this.SavedData = this.SavedData.slice(0, this.CurrentIndex + 1);
        if (this.CurrentIndex > 0 && A == this.SavedData[this.CurrentIndex][0] && this._CheckIsBookmarksEqual(B, this.SavedData[this.CurrentIndex][1])) return;
        else if (this.CurrentIndex == 0 && this.SavedData.length && A == this.SavedData[0][0])
        {
                this.SavedData[0][1] = B;
                return;
        };
        if (this.CurrentIndex + 1 >= FCKConfig.MaxUndoLevels) this.SavedData.shift();
        else this.CurrentIndex++;
        this.SavedData[this.CurrentIndex] = [A, B];
        FCK.Events.FireEvent("OnSelectionChange");
};
FCKUndo.CheckUndoState = function ()
{
        return (this.Changed || this.CurrentIndex > 0);
};
FCKUndo.CheckRedoState = function ()
{
        return (this.CurrentIndex < (this.SavedData.length - 1));
};
FCKUndo.Undo = function ()
{
        if (this.CheckUndoState())
        {
                if (this.CurrentIndex == (this.SavedData.length - 1))
                {
                        this.SaveUndoStep();
                };
                this._ApplyUndoLevel(--this.CurrentIndex);
                FCK.Events.FireEvent("OnSelectionChange");
        }
};
FCKUndo.Redo = function ()
{
        if (this.CheckRedoState())
        {
                this._ApplyUndoLevel(++this.CurrentIndex);
                FCK.Events.FireEvent("OnSelectionChange");
        }
};
FCKUndo._ApplyUndoLevel = function (A)
{
        var B = this.SavedData[A];
        if (!B) return;
        if (FCKBrowserInfo.IsIE)
        {
                if (B[1] && B[1][1]) FCK.SetInnerHtml(B[1][1]);
                else FCK.SetInnerHtml(B[0]);
        }
        else FCK.EditorDocument.body.innerHTML = B[0];
        this._SelectBookmark(B[1]);
        this.TypesCount = 0;
        this.Changed = false;
        this.Typing = false;
};
var FCKEditingArea = function (A)
        {
                this.TargetElement = A;
                this.Mode = 0;
                if (FCK.IECleanup) FCK.IECleanup.AddItem(this, FCKEditingArea_Cleanup);
        };
FCKEditingArea.prototype.Start = function (A, B)
{
        var C = this.TargetElement;
        var D = FCKTools.GetElementDocument(C);
        while (C.firstChild) C.removeChild(C.firstChild);
        if (this.Mode == 0)
        {
                if (FCK_IS_CUSTOM_DOMAIN) A = '<script>document.domain="' + FCK_RUNTIME_DOMAIN + '";</script>' + A;
                if (FCKBrowserInfo.IsIE) A = A.replace(/(<base[^>]*?)\s*\/?>(?!\s*<\/base>)/gi, '$1></base>');
                else if (!B)
                {
                        var E = A.match(FCKRegexLib.BeforeBody);
                        var F = A.match(FCKRegexLib.AfterBody);
                        if (E && F)
                        {
                                var G = A.substr(E[1].length, A.length - E[1].length - F[1].length);
                                A = E[1] + '&nbsp;' + F[1];
                                if (FCKBrowserInfo.IsGecko && (G.length == 0 || FCKRegexLib.EmptyParagraph.test(G))) G = '<br type="_moz">';
                                this._BodyHTML = G;
                        }
                        else this._BodyHTML = A;
                };
                var H = this.IFrame = D.createElement('iframe');
                var I = '<script type="text/javascript" _fcktemp="true">window.onerror=function(){return true;};</script>';
                H.frameBorder = 0;
                H.style.width = H.style.height = '100%';
                if (FCK_IS_CUSTOM_DOMAIN && FCKBrowserInfo.IsIE)
                {
                        window._FCKHtmlToLoad = A.replace(/<head>/i, '<head>' + I);
                        H.src = 'javascript:void( (function(){document.open() ;document.domain="' + document.domain + '" ;document.write( window.parent._FCKHtmlToLoad );document.close() ;window.parent._FCKHtmlToLoad = null ;})() )';
                }
                else if (!FCKBrowserInfo.IsGecko)
                {
                        H.src = 'javascript:void(0)';
                };
                C.appendChild(H);
                this.Window = H.contentWindow;
                if (!FCK_IS_CUSTOM_DOMAIN || !FCKBrowserInfo.IsIE)
                {
                        var J = this.Window.document;
                        J.open();
                        J.write(A.replace(/<head>/i, '<head>' + I));
                        J.close();
                };
                if (FCKBrowserInfo.IsAIR) FCKAdobeAIR.EditingArea_Start(J, A);
                if (FCKBrowserInfo.IsGecko10 && !B)
                {
                        this.Start(A, true);
                        return;
                };
                if (H.readyState && H.readyState != 'completed')
                {
                        var K = this;
                        setTimeout(function ()
                        {
                                try
                                {
                                        K.Window.document.documentElement.doScroll("left");
                                }
                                catch (e)
                                {
                                        setTimeout(arguments.callee, 0);
                                        return;
                                };
                                K.Window._FCKEditingArea = K;
                                FCKEditingArea_CompleteStart.call(K.Window);
                        }, 0);
                }
                else
                {
                        this.Window._FCKEditingArea = this;
                        if (FCKBrowserInfo.IsGecko10) this.Window.setTimeout(FCKEditingArea_CompleteStart, 500);
                        else FCKEditingArea_CompleteStart.call(this.Window);
                }
        }
        else
        {
                var L = this.Textarea = D.createElement('textarea');
                L.className = 'SourceField';
                L.dir = 'ltr';
                FCKDomTools.SetElementStyles(L, {
                        width: '100%',
                        height: '100%',
                        border: 'none',
                        resize: 'none',
                        outline: 'none'
                });
                C.appendChild(L);
                L.value = A;
                FCKTools.RunFunction(this.OnLoad);
        }
};

function FCKEditingArea_CompleteStart()
{
        if (!this.document.body)
        {
                this.setTimeout(FCKEditingArea_CompleteStart, 50);
                return;
        };
        var A = this._FCKEditingArea;
        A.Document = A.Window.document;
        A.MakeEditable();
        FCKTools.RunFunction(A.OnLoad);
};
FCKEditingArea.prototype.MakeEditable = function ()
{
        var A = this.Document;
        if (FCKBrowserInfo.IsIE)
        {
                A.body.disabled = true;
                A.body.contentEditable = true;
                A.body.removeAttribute("disabled");
        }
        else
        {
                try
                {
                        A.body.spellcheck = (this.FFSpellChecker !== false);
                        if (this._BodyHTML)
                        {
                                A.body.innerHTML = this._BodyHTML;
                                A.body.offsetLeft;
                                this._BodyHTML = null;
                        };
                        A.designMode = 'on';
                        A.execCommand('enableObjectResizing', false, !FCKConfig.DisableObjectResizing);
                        A.execCommand('enableInlineTableEditing', false, !FCKConfig.DisableFFTableHandles);
                }
                catch (e)
                {
                        FCKTools.AddEventListener(this.Window.frameElement, 'DOMAttrModified', FCKEditingArea_Document_AttributeNodeModified);
                }
        }
};

function FCKEditingArea_Document_AttributeNodeModified(A)
{
        var B = A.currentTarget.contentWindow._FCKEditingArea;
        if (B._timer) window.clearTimeout(B._timer);
        B._timer = FCKTools.SetTimeout(FCKEditingArea_MakeEditableByMutation, 1000, B);
};

function FCKEditingArea_MakeEditableByMutation()
{
        delete this._timer;
        FCKTools.RemoveEventListener(this.Window.frameElement, 'DOMAttrModified', FCKEditingArea_Document_AttributeNodeModified);
        this.MakeEditable();
};
FCKEditingArea.prototype.Focus = function ()
{
        try
        {
                if (this.Mode == 0)
                {
                        if (FCKBrowserInfo.IsIE) this._FocusIE();
                        else this.Window.focus();
                }
                else
                {
                        var A = FCKTools.GetElementDocument(this.Textarea);
                        if ((!A.hasFocus || A.hasFocus()) && A.activeElement == this.Textarea) return;
                        this.Textarea.focus();
                }
        }
        catch (e)
        {}
};
FCKEditingArea.prototype._FocusIE = function ()
{
        this.Document.body.setActive();
        this.Window.focus();
        var A = this.Document.selection.createRange();
        var B = A.parentElement();
        var C = B.nodeName.toLowerCase();
        if (B.childNodes.length > 0 || !(FCKListsLib.BlockElements[C] || FCKListsLib.NonEmptyBlockElements[C]))
        {
                return;
        };
        A = new FCKDomRange(this.Window);
        A.MoveToElementEditStart(B);
        A.Select();
};

function FCKEditingArea_Cleanup()
{
        if (this.Document)
        {
                this.Document.selection.empty();
                this.Document.body.innerHTML = "";
        };
        this.TargetElement = null;
        this.IFrame = null;
        this.Document = null;
        this.Textarea = null;
        if (this.Window)
        {
                this.Window._FCKEditingArea = null;
                this.Window = null;
        }
};
var FCKKeystrokeHandler = function (A)
        {
                this.Keystrokes = {};
                this.CancelCtrlDefaults = (A !== false);
        };
FCKKeystrokeHandler.prototype.AttachToElement = function (A)
{
        FCKTools.AddEventListenerEx(A, 'keydown', _FCKKeystrokeHandler_OnKeyDown, this);
        if (FCKBrowserInfo.IsGecko10 || FCKBrowserInfo.IsOpera || (FCKBrowserInfo.IsGecko && FCKBrowserInfo.IsMac)) FCKTools.AddEventListenerEx(A, 'keypress', _FCKKeystrokeHandler_OnKeyPress, this);
};
FCKKeystrokeHandler.prototype.SetKeystrokes = function ()
{
        for (var i = 0; i < arguments.length; i++)
        {
                var A = arguments[i];
                if (!A) continue;
                if (typeof (A[0]) == 'object') this.SetKeystrokes.apply(this, A);
                else
                {
                        if (A.length == 1) delete this.Keystrokes[A[0]];
                        else this.Keystrokes[A[0]] = A[1] === true ? true : A;
                }
        }
};

function _FCKKeystrokeHandler_OnKeyDown(A, B)
{
        var C = A.keyCode || A.which;
        var D = 0;
        if (A.ctrlKey || A.metaKey) D += CTRL;
        if (A.shiftKey) D += SHIFT;
        if (A.altKey) D += ALT;
        var E = C + D;
        var F = B._CancelIt = false;
        var G = B.Keystrokes[E];
        if (G)
        {
                if (G === true || !(B.OnKeystroke && B.OnKeystroke.apply(B, G))) return true;
                F = true;
        };
        if (F || (B.CancelCtrlDefaults && D == CTRL && (C < 33 || C > 40)))
        {
                B._CancelIt = true;
                if (A.preventDefault) return A.preventDefault();
                A.returnValue = false;
                A.cancelBubble = true;
                return false;
        };
        return true;
};

function _FCKKeystrokeHandler_OnKeyPress(A, B)
{
        if (B._CancelIt)
        {
                if (A.preventDefault) return A.preventDefault();
                return false;
        };
        return true;
};
FCK.DTD = (function ()
{
        var X = FCKTools.Merge;
        var A, L, J, M, N, O, D, H, P, K, Q, F, G, C, B, E, I;
        A = {
                isindex: 1,
                fieldset: 1
        };
        B = {
                input: 1,
                button: 1,
                select: 1,
                textarea: 1,
                label: 1
        };
        C = X(
        {
                a: 1
        }, B);
        D = X(
        {
                iframe: 1
        }, C);
        E = {
                hr: 1,
                ul: 1,
                menu: 1,
                div: 1,
                blockquote: 1,
                noscript: 1,
                table: 1,
                center: 1,
                address: 1,
                dir: 1,
                pre: 1,
                h5: 1,
                dl: 1,
                h4: 1,
                noframes: 1,
                h6: 1,
                ol: 1,
                h1: 1,
                h3: 1,
                h2: 1
        };
        F = {
                ins: 1,
                del: 1,
                script: 1
        };
        G = X(
        {
                b: 1,
                acronym: 1,
                bdo: 1,
                'var': 1,
                '#': 1,
                abbr: 1,
                code: 1,
                br: 1,
                i: 1,
                cite: 1,
                kbd: 1,
                u: 1,
                strike: 1,
                s: 1,
                tt: 1,
                strong: 1,
                q: 1,
                samp: 1,
                em: 1,
                dfn: 1,
                span: 1
        }, F);
        H = X(
        {
                sub: 1,
                img: 1,
                object: 1,
                sup: 1,
                basefont: 1,
                map: 1,
                applet: 1,
                font: 1,
                big: 1,
                small: 1
        }, G);
        I = X(
        {
                p: 1
        }, H);
        J = X(
        {
                iframe: 1
        }, H, B);
        K = {
                img: 1,
                noscript: 1,
                br: 1,
                kbd: 1,
                center: 1,
                button: 1,
                basefont: 1,
                h5: 1,
                h4: 1,
                samp: 1,
                h6: 1,
                ol: 1,
                h1: 1,
                h3: 1,
                h2: 1,
                form: 1,
                font: 1,
                '#': 1,
                select: 1,
                menu: 1,
                ins: 1,
                abbr: 1,
                label: 1,
                code: 1,
                table: 1,
                script: 1,
                cite: 1,
                input: 1,
                iframe: 1,
                strong: 1,
                textarea: 1,
                noframes: 1,
                big: 1,
                small: 1,
                span: 1,
                hr: 1,
                sub: 1,
                bdo: 1,
                'var': 1,
                div: 1,
                object: 1,
                sup: 1,
                strike: 1,
                dir: 1,
                map: 1,
                dl: 1,
                applet: 1,
                del: 1,
                isindex: 1,
                fieldset: 1,
                ul: 1,
                b: 1,
                acronym: 1,
                a: 1,
                blockquote: 1,
                i: 1,
                u: 1,
                s: 1,
                tt: 1,
                address: 1,
                q: 1,
                pre: 1,
                p: 1,
                em: 1,
                dfn: 1
        };
        L = X(
        {
                a: 1
        }, J);
        M = {
                tr: 1
        };
        N = {
                '#': 1
        };
        O = X(
        {
                param: 1
        }, K);
        P = X(
        {
                form: 1
        }, A, D, E, I);
        Q = {
                li: 1
        };
        return {
                col: {},
                tr: {
                        td: 1,
                        th: 1
                },
                img: {},
                colgroup: {
                        col: 1
                },
                noscript: P,
                td: P,
                br: {},
                th: P,
                center: P,
                kbd: L,
                button: X(I, E),
                basefont: {},
                h5: L,
                h4: L,
                samp: L,
                h6: L,
                ol: Q,
                h1: L,
                h3: L,
                option: N,
                h2: L,
                form: X(A, D, E, I),
                select: {
                        optgroup: 1,
                        option: 1
                },
                font: J,
                ins: P,
                menu: Q,
                abbr: L,
                label: L,
                table: {
                        thead: 1,
                        col: 1,
                        tbody: 1,
                        tr: 1,
                        colgroup: 1,
                        caption: 1,
                        tfoot: 1
                },
                code: L,
                script: N,
                tfoot: M,
                cite: L,
                li: P,
                input: {},
                iframe: P,
                strong: J,
                textarea: N,
                noframes: P,
                big: J,
                small: J,
                span: J,
                hr: {},
                dt: L,
                sub: J,
                optgroup: {
                        option: 1
                },
                param: {},
                bdo: L,
                'var': J,
                div: P,
                object: O,
                sup: J,
                dd: P,
                strike: J,
                area: {},
                dir: Q,
                map: X(
                {
                        area: 1,
                        form: 1,
                        p: 1
                }, A, F, E),
                applet: O,
                dl: {
                        dt: 1,
                        dd: 1
                },
                del: P,
                isindex: {},
                fieldset: X(
                {
                        legend: 1
                }, K),
                thead: M,
                ul: Q,
                acronym: L,
                b: J,
                a: J,
                blockquote: P,
                caption: L,
                i: J,
                u: J,
                tbody: M,
                s: L,
                address: X(D, I),
                tt: J,
                legend: L,
                q: L,
                pre: X(G, C),
                p: L,
                em: J,
                dfn: L
        };
})();
var FCKStyle = function (A)
        {
                this.Element = (A.Element || 'span').toLowerCase();
                this._StyleDesc = A;
        };
FCKStyle.prototype = {
        GetType: function ()
        {
                var A = this.GetType_$;
                if (A != undefined) return A;
                var B = this.Element;
                if (B == '#' || FCKListsLib.StyleBlockElements[B]) A = 0;
                else if (FCKListsLib.StyleObjectElements[B]) A = 2;
                else A = 1;
                return (this.GetType_$ = A);
        },
        ApplyToSelection: function (A)
        {
                var B = new FCKDomRange(A);
                B.MoveToSelection();
                this.ApplyToRange(B, true);
        },
        ApplyToRange: function (A, B, C)
        {
                switch (this.GetType())
                {
                case 0:
                        this.ApplyToRange = this._ApplyBlockStyle;
                        break;
                case 1:
                        this.ApplyToRange = this._ApplyInlineStyle;
                        break;
                default:
                        return;
                };
                this.ApplyToRange(A, B, C);
        },
        ApplyToObject: function (A)
        {
                if (!A) return;
                this.BuildElement(null, A);
        },
        RemoveFromSelection: function (A)
        {
                var B = new FCKDomRange(A);
                B.MoveToSelection();
                this.RemoveFromRange(B, true);
        },
        RemoveFromRange: function (A, B, C)
        {
                var D;
                var E = this._GetAttribsForComparison();
                var F = this._GetOverridesForComparison();
                if (A.CheckIsCollapsed())
                {
                        var D = A.CreateBookmark(true);
                        var H = A.GetBookmarkNode(D, true);
                        var I = new FCKElementPath(H.parentNode);
                        var J = [];
                        var K = !FCKDomTools.GetNextSibling(H);
                        var L = K || !FCKDomTools.GetPreviousSibling(H);
                        var M;
                        var N = -1;
                        for (var i = 0; i < I.Elements.length; i++)
                        {
                                var O = I.Elements[i];
                                if (this.CheckElementRemovable(O))
                                {
                                        if (L && !FCKDomTools.CheckIsEmptyElement(O, function (el)
                                        {
                                                return (el != H);
                                        }))
                                        {
                                                M = O;
                                                N = J.length - 1;
                                        }
                                        else
                                        {
                                                var P = O.nodeName.toLowerCase();
                                                if (P == this.Element)
                                                {
                                                        for (var Q in E)
                                                        {
                                                                if (FCKDomTools.HasAttribute(O, Q))
                                                                {
                                                                        switch (Q)
                                                                        {
                                                                        case 'style':
                                                                                this._RemoveStylesFromElement(O);
                                                                                break;
                                                                        case 'class':
                                                                                if (FCKDomTools.GetAttributeValue(O, Q) != this.GetFinalAttributeValue(Q)) continue;
                                                                        default:
                                                                                FCKDomTools.RemoveAttribute(O, Q);
                                                                        }
                                                                }
                                                        }
                                                };
                                                this._RemoveOverrides(O, F[P]);
                                                if (this.GetType() == 1) this._RemoveNoAttribElement(O);
                                        }
                                }
                                else if (L) J.push(O);
                                L = L && ((K && !FCKDomTools.GetNextSibling(O)) || (!K && !FCKDomTools.GetPreviousSibling(O)));
                                if (M && (!L || (i == I.Elements.length - 1)))
                                {
                                        var R = FCKDomTools.RemoveNode(H);
                                        for (var j = 0; j <= N; j++)
                                        {
                                                var S = FCKDomTools.CloneElement(J[j]);
                                                S.appendChild(R);
                                                R = S;
                                        };
                                        if (K) FCKDomTools.InsertAfterNode(M, R);
                                        else M.parentNode.insertBefore(R, M);
                                        L = false;
                                        M = null;
                                }
                        };
                        if (B) A.SelectBookmark(D);
                        if (C) A.MoveToBookmark(D);
                        return;
                };
                A.Expand('inline_elements');
                D = A.CreateBookmark(true);
                var T = A.GetBookmarkNode(D, true);
                var U = A.GetBookmarkNode(D, false);
                A.Release(true);
                var I = new FCKElementPath(T);
                var X = I.Elements;
                var O;
                for (var i = 1; i < X.length; i++)
                {
                        O = X[i];
                        if (O == I.Block || O == I.BlockLimit) break;
                        if (this.CheckElementRemovable(O)) FCKDomTools.BreakParent(T, O, A);
                };
                I = new FCKElementPath(U);
                X = I.Elements;
                for (var i = 1; i < X.length; i++)
                {
                        O = X[i];
                        if (O == I.Block || O == I.BlockLimit) break;
                        b = O.nodeName.toLowerCase();
                        if (this.CheckElementRemovable(O)) FCKDomTools.BreakParent(U, O, A);
                };
                var Z = FCKDomTools.GetNextSourceNode(T, true);
                while (Z)
                {
                        var a = FCKDomTools.GetNextSourceNode(Z);
                        if (Z.nodeType == 1)
                        {
                                var b = Z.nodeName.toLowerCase();
                                var c = (b == this.Element);
                                if (c)
                                {
                                        for (var Q in E)
                                        {
                                                if (FCKDomTools.HasAttribute(Z, Q))
                                                {
                                                        switch (Q)
                                                        {
                                                        case 'style':
                                                                this._RemoveStylesFromElement(Z);
                                                                break;
                                                        case 'class':
                                                                if (FCKDomTools.GetAttributeValue(Z, Q) != this.GetFinalAttributeValue(Q)) continue;
                                                        default:
                                                                FCKDomTools.RemoveAttribute(Z, Q);
                                                        }
                                                }
                                        }
                                }
                                else c = !! F[b];
                                if (c)
                                {
                                        this._RemoveOverrides(Z, F[b]);
                                        this._RemoveNoAttribElement(Z);
                                }
                        };
                        if (a == U) break;
                        Z = a;
                };
                this._FixBookmarkStart(T);
                if (B) A.SelectBookmark(D);
                if (C) A.MoveToBookmark(D);
        },
        CheckElementRemovable: function (A, B)
        {
                if (!A) return false;
                var C = A.nodeName.toLowerCase();
                if (C == this.Element)
                {
                        if (!B && !FCKDomTools.HasAttributes(A)) return true;
                        var D = this._GetAttribsForComparison();
                        var E = (D._length == 0);
                        for (var F in D)
                        {
                                if (F == '_length') continue;
                                if (this._CompareAttributeValues(F, FCKDomTools.GetAttributeValue(A, F), (this.GetFinalAttributeValue(F) || '')))
                                {
                                        E = true;
                                        if (!B) break;
                                }
                                else
                                {
                                        E = false;
                                        if (B) return false;
                                }
                        };
                        if (E) return true;
                };
                var G = this._GetOverridesForComparison()[C];
                if (G)
                {
                        if (!(D = G.Attributes)) return true;
                        for (var i = 0; i < D.length; i++)
                        {
                                var H = D[i][0];
                                if (FCKDomTools.HasAttribute(A, H))
                                {
                                        var I = D[i][1];
                                        if (I == null || (typeof I == 'string' && FCKDomTools.GetAttributeValue(A, H) == I) || I.test(FCKDomTools.GetAttributeValue(A, H))) return true;
                                }
                        }
                };
                return false;
        },
        CheckActive: function (A)
        {
                switch (this.GetType())
                {
                case 0:
                        return this.CheckElementRemovable(A.Block || A.BlockLimit, true);
                case 1:
                        var B = A.Elements;
                        for (var i = 0; i < B.length; i++)
                        {
                                var C = B[i];
                                if (C == A.Block || C == A.BlockLimit) continue;
                                if (this.CheckElementRemovable(C, true)) return true;
                        }
                };
                return false;
        },
        RemoveFromElement: function (A)
        {
                var B = this._GetAttribsForComparison();
                var C = this._GetOverridesForComparison();
                var D = A.getElementsByTagName(this.Element);
                for (var i = D.length - 1; i >= 0; i--)
                {
                        var E = D[i];
                        for (var F in B)
                        {
                                if (FCKDomTools.HasAttribute(E, F))
                                {
                                        switch (F)
                                        {
                                        case 'style':
                                                this._RemoveStylesFromElement(E);
                                                break;
                                        case 'class':
                                                if (FCKDomTools.GetAttributeValue(E, F) != this.GetFinalAttributeValue(F)) continue;
                                        default:
                                                FCKDomTools.RemoveAttribute(E, F);
                                        }
                                }
                        };
                        this._RemoveOverrides(E, C[this.Element]);
                        this._RemoveNoAttribElement(E);
                };
                for (var G in C)
                {
                        if (G != this.Element)
                        {
                                D = A.getElementsByTagName(G);
                                for (var i = D.length - 1; i >= 0; i--)
                                {
                                        var E = D[i];
                                        this._RemoveOverrides(E, C[G]);
                                        this._RemoveNoAttribElement(E);
                                }
                        }
                }
        },
        _RemoveStylesFromElement: function (A)
        {
                var B = A.style.cssText;
                var C = this.GetFinalStyleValue();
                if (B.length > 0 && C.length == 0) return;
                C = '(^|;)\\s*(' + C.replace(/\s*([^ ]+):.*?(;|$)/g, '$1|').replace(/\|$/, '') + '):[^;]+';
                var D = new RegExp(C, 'gi');
                B = B.replace(D, '').Trim();
                if (B.length == 0 || B == ';') FCKDomTools.RemoveAttribute(A, 'style');
                else A.style.cssText = B.replace(D, '');
        },
        _RemoveOverrides: function (A, B)
        {
                var C = B && B.Attributes;
                if (C)
                {
                        for (var i = 0; i < C.length; i++)
                        {
                                var D = C[i][0];
                                if (FCKDomTools.HasAttribute(A, D))
                                {
                                        var E = C[i][1];
                                        if (E == null || (E.test && E.test(FCKDomTools.GetAttributeValue(A, D))) || (typeof E == 'string' && FCKDomTools.GetAttributeValue(A, D) == E)) FCKDomTools.RemoveAttribute(A, D);
                                }
                        }
                }
        },
        _RemoveNoAttribElement: function (A)
        {
                if (!FCKDomTools.HasAttributes(A))
                {
                        var B = A.firstChild;
                        var C = A.lastChild;
                        FCKDomTools.RemoveNode(A, true);
                        this._MergeSiblings(B);
                        if (B != C) this._MergeSiblings(C);
                }
        },
        BuildElement: function (A, B)
        {
                var C = B || A.createElement(this.Element);
                var D = this._StyleDesc.Attributes;
                var E;
                if (D)
                {
                        for (var F in D)
                        {
                                E = this.GetFinalAttributeValue(F);
                                if (F.toLowerCase() == 'class') C.className = E;
                                else C.setAttribute(F, E);
                        }
                };
                if (this._GetStyleText().length > 0) C.style.cssText = this.GetFinalStyleValue();
                return C;
        },
        _CompareAttributeValues: function (A, B, C)
        {
                if (A == 'style' && B && C)
                {
                        B = B.replace(/;$/, '').toLowerCase();
                        C = C.replace(/;$/, '').toLowerCase();
                };
                return (B == C || ((B === null || B === '') && (C === null || C === '')))
        },
        GetFinalAttributeValue: function (A)
        {
                var B = this._StyleDesc.Attributes;
                var B = B ? B[A] : null;
                if (!B && A == 'style') return this.GetFinalStyleValue();
                if (B && this._Variables) B = B.Replace(FCKRegexLib.StyleVariableAttName, this._GetVariableReplace, this);
                return B;
        },
        GetFinalStyleValue: function ()
        {
                var A = this._GetStyleText();
                if (A.length > 0 && this._Variables)
                {
                        A = A.Replace(FCKRegexLib.StyleVariableAttName, this._GetVariableReplace, this);
                        A = FCKTools.NormalizeCssText(A);
                };
                return A;
        },
        _GetVariableReplace: function ()
        {
                return this._Variables[arguments[2]] || arguments[0];
        },
        SetVariable: function (A, B)
        {
                var C = this._Variables;
                if (!C) C = this._Variables = {};
                this._Variables[A] = B;
        },
        _FromPre: function (A, B, C)
        {
                var D = B.innerHTML;
                D = D.replace(/(\r\n|\r)/g, '\n');
                D = D.replace(/^[ \t]*\n/, '');
                D = D.replace(/\n$/, '');
                D = D.replace(/^[ \t]+|[ \t]+$/g, function (match, offset, s)
                {
                        if (match.length == 1) return '&nbsp;';
                        else if (offset == 0) return new Array(match.length).join('&nbsp;') + ' ';
                        else return ' ' + new Array(match.length).join('&nbsp;');
                });
                var E = new FCKHtmlIterator(D);
                var F = [];
                E.Each(function (isTag, value)
                {
                        if (!isTag)
                        {
                                value = value.replace(/\n/g, '<br>');
                                value = value.replace(/[ \t]{2,}/g, function (match)
                                {
                                        return new Array(match.length).join('&nbsp;') + ' ';
                                });
                        };
                        F.push(value);
                });
                C.innerHTML = F.join('');
                return C;
        },
        _ToPre: function (A, B, C)
        {
                var D = B.innerHTML.Trim();
                D = D.replace(/[ \t\r\n]*(<br[^>]*>)[ \t\r\n]*/gi, '<br />');
                var E = new FCKHtmlIterator(D);
                var F = [];
                E.Each(function (isTag, value)
                {
                        if (!isTag) value = value.replace(/([ \t\n\r]+|&nbsp;)/g, ' ');
                        else if (isTag && value == '<br />') value = '\n';
                        F.push(value);
                });
                if (FCKBrowserInfo.IsIE)
                {
                        var G = A.createElement('div');
                        G.appendChild(C);
                        C.outerHTML = '<pre>\n' + F.join('') + '</pre>';
                        C = G.removeChild(G.firstChild);
                }
                else C.innerHTML = F.join('');
                return C;
        },
        _CheckAndMergePre: function (A, B)
        {
                if (A != FCKDomTools.GetPreviousSourceElement(B, true)) return;
                var C = A.innerHTML.replace(/\n$/, '') + '\n\n' + B.innerHTML.replace(/^\n/, '');
                if (FCKBrowserInfo.IsIE) B.outerHTML = '<pre>' + C + '</pre>';
                else B.innerHTML = C;
                FCKDomTools.RemoveNode(A);
        },
        _CheckAndSplitPre: function (A)
        {
                var B;
                var C = A.firstChild;
                C = C && C.nextSibling;
                while (C)
                {
                        var D = C.nextSibling;
                        if (D && D.nextSibling && C.nodeName.IEquals('br') && D.nodeName.IEquals('br'))
                        {
                                FCKDomTools.RemoveNode(C);
                                C = D.nextSibling;
                                FCKDomTools.RemoveNode(D);
                                B = FCKDomTools.InsertAfterNode(B || A, FCKDomTools.CloneElement(A));
                                continue;
                        };
                        if (B)
                        {
                                C = C.previousSibling;
                                FCKDomTools.MoveNode(C.nextSibling, B);
                        };
                        C = C.nextSibling;
                }
        },
        _ApplyBlockStyle: function (A, B, C)
        {
                var D;
                if (B) D = A.CreateBookmark();
                var E = new FCKDomRangeIterator(A);
                E.EnforceRealBlocks = true;
                var F;
                var G = A.Window.document;
                var H;
                while ((F = E.GetNextParagraph()))
                {
                        var I = this.BuildElement(G);
                        var J = I.nodeName.IEquals('pre');
                        var K = F.nodeName.IEquals('pre');
                        var L = J && !K;
                        var M = !J && K;
                        if (L) I = this._ToPre(G, F, I);
                        else if (M) I = this._FromPre(G, F, I);
                        else FCKDomTools.MoveChildren(F, I);
                        F.parentNode.insertBefore(I, F);
                        FCKDomTools.RemoveNode(F);
                        if (J)
                        {
                                if (H) this._CheckAndMergePre(H, I);
                                H = I;
                        }
                        else if (M) this._CheckAndSplitPre(I);
                };
                if (B) A.SelectBookmark(D);
                if (C) A.MoveToBookmark(D);
        },
        _ApplyInlineStyle: function (A, B, C)
        {
                var D = A.Window.document;
                if (A.CheckIsCollapsed())
                {
                        var E = this.BuildElement(D);
                        A.InsertNode(E);
                        A.MoveToPosition(E, 2);
                        A.Select();
                        return;
                };
                var F = this.Element;
                var G = FCK.DTD[F] || FCK.DTD.span;
                var H = this._GetAttribsForComparison();
                var I;
                A.Expand('inline_elements');
                var J = A.CreateBookmark(true);
                var K = A.GetBookmarkNode(J, true);
                var L = A.GetBookmarkNode(J, false);
                A.Release(true);
                var M = FCKDomTools.GetNextSourceNode(K, true);
                while (M)
                {
                        var N = false;
                        var O = M.nodeType;
                        var P = O == 1 ? M.nodeName.toLowerCase() : null;
                        if (!P || G[P])
                        {
                                if ((FCK.DTD[M.parentNode.nodeName.toLowerCase()] || FCK.DTD.span)[F] || !FCK.DTD[F])
                                {
                                        if (!A.CheckHasRange()) A.SetStart(M, 3);
                                        if (O != 1 || M.childNodes.length == 0)
                                        {
                                                var Q = M;
                                                var R = Q.parentNode;
                                                while (Q == R.lastChild && G[R.nodeName.toLowerCase()])
                                                {
                                                        Q = R;
                                                };
                                                A.SetEnd(Q, 4);
                                                if (Q == Q.parentNode.lastChild && !G[Q.parentNode.nodeName.toLowerCase()]) N = true;
                                        }
                                        else
                                        {
                                                A.SetEnd(M, 3);
                                        }
                                }
                                else N = true;
                        }
                        else N = true;
                        M = FCKDomTools.GetNextSourceNode(M);
                        if (M == L)
                        {
                                M = null;
                                N = true;
                        };
                        if (N && A.CheckHasRange() && !A.CheckIsCollapsed())
                        {
                                I = this.BuildElement(D);
                                A.ExtractContents().AppendTo(I);
                                if (I.innerHTML.RTrim().length > 0)
                                {
                                        A.InsertNode(I);
                                        this.RemoveFromElement(I);
                                        this._MergeSiblings(I, this._GetAttribsForComparison());
                                        if (!FCKBrowserInfo.IsIE) I.normalize();
                                };
                                A.Release(true);
                        }
                };
                this._FixBookmarkStart(K);
                if (B) A.SelectBookmark(J);
                if (C) A.MoveToBookmark(J);
        },
        _FixBookmarkStart: function (A)
        {
                var B;
                while ((B = A.nextSibling))
                {
                        if (B.nodeType == 1 && FCKListsLib.InlineNonEmptyElements[B.nodeName.toLowerCase()])
                        {
                                if (!B.firstChild) FCKDomTools.RemoveNode(B);
                                else FCKDomTools.MoveNode(A, B, true);
                                continue;
                        };
                        if (B.nodeType == 3 && B.length == 0)
                        {
                                FCKDomTools.RemoveNode(B);
                                continue;
                        };
                        break;
                }
        },
        _MergeSiblings: function (A, B)
        {
                if (!A || A.nodeType != 1 || !FCKListsLib.InlineNonEmptyElements[A.nodeName.toLowerCase()]) return;
                this._MergeNextSibling(A, B);
                this._MergePreviousSibling(A, B);
        },
        _MergeNextSibling: function (A, B)
        {
                var C = A.nextSibling;
                var D = (C && C.nodeType == 1 && C.getAttribute('_fck_bookmark'));
                if (D) C = C.nextSibling;
                if (C && C.nodeType == 1 && C.nodeName == A.nodeName)
                {
                        if (!B) B = this._CreateElementAttribsForComparison(A);
                        if (this._CheckAttributesMatch(C, B))
                        {
                                var E = A.lastChild;
                                if (D) FCKDomTools.MoveNode(A.nextSibling, A);
                                FCKDomTools.MoveChildren(C, A);
                                FCKDomTools.RemoveNode(C);
                                if (E) this._MergeNextSibling(E);
                        }
                }
        },
        _MergePreviousSibling: function (A, B)
        {
                var C = A.previousSibling;
                var D = (C && C.nodeType == 1 && C.getAttribute('_fck_bookmark'));
                if (D) C = C.previousSibling;
                if (C && C.nodeType == 1 && C.nodeName == A.nodeName)
                {
                        if (!B) B = this._CreateElementAttribsForComparison(A);
                        if (this._CheckAttributesMatch(C, B))
                        {
                                var E = A.firstChild;
                                if (D) FCKDomTools.MoveNode(A.previousSibling, A, true);
                                FCKDomTools.MoveChildren(C, A, true);
                                FCKDomTools.RemoveNode(C);
                                if (E) this._MergePreviousSibling(E);
                        }
                }
        },
        _GetStyleText: function ()
        {
                var A = this._StyleDesc.Styles;
                var B = (this._StyleDesc.Attributes ? this._StyleDesc.Attributes['style'] || '' : '');
                if (B.length > 0) B += ';';
                for (var C in A) B += C + ':' + A[C] + ';';
                if (B.length > 0 && !(/#\(/.test(B)))
                {
                        B = FCKTools.NormalizeCssText(B);
                };
                return (this._GetStyleText = function ()
                {
                        return B;
                })();
        },
        _GetAttribsForComparison: function ()
        {
                var A = this._GetAttribsForComparison_$;
                if (A) return A;
                A = {};
                var B = this._StyleDesc.Attributes;
                if (B)
                {
                        for (var C in B)
                        {
                                A[C.toLowerCase()] = B[C].toLowerCase();
                        }
                };
                if (this._GetStyleText().length > 0)
                {
                        A['style'] = this._GetStyleText().toLowerCase();
                };
                FCKTools.AppendLengthProperty(A, '_length');
                return (this._GetAttribsForComparison_$ = A);
        },
        _GetOverridesForComparison: function ()
        {
                var A = this._GetOverridesForComparison_$;
                if (A) return A;
                A = {};
                var B = this._StyleDesc.Overrides;
                if (B)
                {
                        if (!FCKTools.IsArray(B)) B = [B];
                        for (var i = 0; i < B.length; i++)
                        {
                                var C = B[i];
                                var D;
                                var E;
                                var F;
                                if (typeof C == 'string') D = C.toLowerCase();
                                else
                                {
                                        D = C.Element ? C.Element.toLowerCase() : this.Element;
                                        F = C.Attributes;
                                };
                                E = A[D] || (A[D] = {});
                                if (F)
                                {
                                        var G = (E.Attributes = E.Attributes || []);
                                        for (var H in F)
                                        {
                                                G.push([H.toLowerCase(), F[H]]);
                                        }
                                }
                        }
                };
                return (this._GetOverridesForComparison_$ = A);
        },
        _CreateElementAttribsForComparison: function (A)
        {
                var B = {};
                var C = 0;
                for (var i = 0; i < A.attributes.length; i++)
                {
                        var D = A.attributes[i];
                        if (D.specified)
                        {
                                B[D.nodeName.toLowerCase()] = FCKDomTools.GetAttributeValue(A, D).toLowerCase();
                                C++;
                        }
                };
                B._length = C;
                return B;
        },
        _CheckAttributesMatch: function (A, B)
        {
                var C = A.attributes;
                var D = 0;
                for (var i = 0; i < C.length; i++)
                {
                        var E = C[i];
                        if (E.specified)
                        {
                                var F = E.nodeName.toLowerCase();
                                var G = B[F];
                                if (!G) break;
                                if (G != FCKDomTools.GetAttributeValue(A, E).toLowerCase()) break;
                                D++;
                        }
                };
                return (D == B._length);
        }
};
var FCKStyles = FCK.Styles = {
        _Callbacks: {},
        _ObjectStyles: {},
        ApplyStyle: function (A)
        {
                if (typeof A == 'string') A = this.GetStyles()[A];
                if (A)
                {
                        if (A.GetType() == 2) A.ApplyToObject(FCKSelection.GetSelectedElement());
                        else A.ApplyToSelection(FCK.EditorWindow);
                        FCK.Events.FireEvent('OnSelectionChange');
                }
        },
        RemoveStyle: function (A)
        {
                if (typeof A == 'string') A = this.GetStyles()[A];
                if (A)
                {
                        A.RemoveFromSelection(FCK.EditorWindow);
                        FCK.Events.FireEvent('OnSelectionChange');
                }
        },
        AttachStyleStateChange: function (A, B, C)
        {
                var D = this._Callbacks[A];
                if (!D) D = this._Callbacks[A] = [];
                D.push([B, C]);
        },
        CheckSelectionChanges: function ()
        {
                var A = FCKSelection.GetBoundaryParentElement(true);
                if (!A) return;
                var B = new FCKElementPath(A);
                var C = this.GetStyles();
                for (var D in C)
                {
                        var E = this._Callbacks[D];
                        if (E)
                        {
                                var F = C[D];
                                var G = F.CheckActive(B);
                                if (G != (F._LastState || null))
                                {
                                        F._LastState = G;
                                        for (var i = 0; i < E.length; i++)
                                        {
                                                var H = E[i][0];
                                                var I = E[i][1];
                                                H.call(I || window, D, G);
                                        }
                                }
                        }
                }
        },
        CheckStyleInSelection: function (A)
        {
                return false;
        },
        _GetRemoveFormatTagsRegex: function ()
        {
                var A = new RegExp('^(?:' + FCKConfig.RemoveFormatTags.replace(/,/g, '|') + ')$', 'i');
                return (this._GetRemoveFormatTagsRegex = function ()
                {
                        return A;
                }) && A;
        },
        RemoveAll: function ()
        {
                var A = new FCKDomRange(FCK.EditorWindow);
                A.MoveToSelection();
                if (A.CheckIsCollapsed()) return;
                A.Expand('inline_elements');
                var B = A.CreateBookmark(true);
                var C = A.GetBookmarkNode(B, true);
                var D = A.GetBookmarkNode(B, false);
                A.Release(true);
                var E = this._GetRemoveFormatTagsRegex();
                var F = new FCKElementPath(C);
                var G = F.Elements;
                var H;
                for (var i = 1; i < G.length; i++)
                {
                        H = G[i];
                        if (H == F.Block || H == F.BlockLimit) break;
                        if (E.test(H.nodeName)) FCKDomTools.BreakParent(C, H, A);
                };
                F = new FCKElementPath(D);
                G = F.Elements;
                for (var i = 1; i < G.length; i++)
                {
                        H = G[i];
                        if (H == F.Block || H == F.BlockLimit) break;
                        elementName = H.nodeName.toLowerCase();
                        if (E.test(H.nodeName)) FCKDomTools.BreakParent(D, H, A);
                };
                var I = FCKDomTools.GetNextSourceNode(C, true, 1);
                while (I)
                {
                        if (I == D) break;
                        var J = FCKDomTools.GetNextSourceNode(I, false, 1);
                        if (E.test(I.nodeName)) FCKDomTools.RemoveNode(I, true);
                        else FCKDomTools.RemoveAttributes(I, FCKConfig.RemoveAttributesArray);
                        I = J;
                };
                A.SelectBookmark(B);
                FCK.Events.FireEvent('OnSelectionChange');
        },
        GetStyle: function (A)
        {
                return this.GetStyles()[A];
        },
        GetStyles: function ()
        {
                var A = this._GetStyles;
                if (!A)
                {
                        A = this._GetStyles = FCKTools.Merge(this._LoadStylesCore(), this._LoadStylesCustom(), this._LoadStylesXml());
                };
                return A;
        },
        CheckHasObjectStyle: function (A)
        {
                return !!this._ObjectStyles[A];
        },
        _LoadStylesCore: function ()
        {
                var A = {};
                var B = FCKConfig.CoreStyles;
                for (var C in B)
                {
                        var D = A['_FCK_' + C] = new FCKStyle(B[C]);
                        D.IsCore = true;
                };
                return A;
        },
        _LoadStylesCustom: function ()
        {
                var A = {};
                var B = FCKConfig.CustomStyles;
                if (B)
                {
                        for (var C in B)
                        {
                                var D = A[C] = new FCKStyle(B[C]);
                                D.Name = C;
                        }
                };
                return A;
        },
        _LoadStylesXml: function ()
        {
                var A = {};
                var B = FCKConfig.StylesXmlPath;
                if (!B || B.length == 0) return A;
                var C = new FCKXml();
                C.LoadUrl(B);
                var D = FCKXml.TransformToObject(C.SelectSingleNode('Styles'));
                var E = D.$Style;
                if (!E) return A;
                for (var i = 0; i < E.length; i++)
                {
                        var F = E[i];
                        var G = (F.element || '').toLowerCase();
                        if (G.length == 0) throw ('The element name is required. Error loading "' + B + '"');
                        var H = {
                                Element: G,
                                Attributes: {},
                                Styles: {},
                                Overrides: []
                        };
                        var I = F.$Attribute || [];
                        for (var j = 0; j < I.length; j++)
                        {
                                H.Attributes[I[j].name] = I[j].value;
                        };
                        var J = F.$Style || [];
                        for (j = 0; j < J.length; j++)
                        {
                                H.Styles[J[j].name] = J[j].value;
                        };
                        var K = F.$Override;
                        if (K)
                        {
                                for (j = 0; j < K.length; j++)
                                {
                                        var L = K[j];
                                        var M = {
                                                Element: L.element
                                        };
                                        var N = L.$Attribute;
                                        if (N)
                                        {
                                                M.Attributes = {};
                                                for (var k = 0; k < N.length; k++)
                                                {
                                                        var O = N[k].value || null;
                                                        if (O)
                                                        {
                                                                var P = O && FCKRegexLib.RegExp.exec(O);
                                                                if (P) O = new RegExp(P[1], P[2] || '');
                                                        };
                                                        M.Attributes[N[k].name] = O;
                                                }
                                        };
                                        H.Overrides.push(M);
                                }
                        };
                        var Q = new FCKStyle(H);
                        Q.Name = F.name || G;
                        if (Q.GetType() == 2) this._ObjectStyles[G] = true;
                        A[Q.Name] = Q;
                };
                return A;
        }
};
var FCKListHandler = {
        OutdentListItem: function (A)
        {
                var B = A.parentNode;
                if (B.tagName.toUpperCase().Equals('UL', 'OL'))
                {
                        var C = FCKTools.GetElementDocument(A);
                        var D = new FCKDocumentFragment(C);
                        var E = D.RootNode;
                        var F = false;
                        var G = FCKDomTools.GetFirstChild(A, ['UL', 'OL']);
                        if (G)
                        {
                                F = true;
                                var H;
                                while ((H = G.firstChild)) E.appendChild(G.removeChild(H));
                                FCKDomTools.RemoveNode(G);
                        };
                        var I;
                        var J = false;
                        while ((I = A.nextSibling))
                        {
                                if (!F && I.nodeType == 1 && I.nodeName.toUpperCase() == 'LI') J = F = true;
                                E.appendChild(I.parentNode.removeChild(I));
                                if (!J && I.nodeType == 1 && I.nodeName.toUpperCase().Equals('UL', 'OL')) FCKDomTools.RemoveNode(I, true);
                        };
                        var K = B.parentNode.tagName.toUpperCase();
                        var L = (K == 'LI');
                        if (L || K.Equals('UL', 'OL'))
                        {
                                if (F)
                                {
                                        var G = B.cloneNode(false);
                                        D.AppendTo(G);
                                        A.appendChild(G);
                                }
                                else if (L) D.InsertAfterNode(B.parentNode);
                                else D.InsertAfterNode(B);
                                if (L) FCKDomTools.InsertAfterNode(B.parentNode, B.removeChild(A));
                                else FCKDomTools.InsertAfterNode(B, B.removeChild(A));
                        }
                        else
                        {
                                if (F)
                                {
                                        var N = B.cloneNode(false);
                                        D.AppendTo(N);
                                        FCKDomTools.InsertAfterNode(B, N);
                                };
                                var O = C.createElement(FCKConfig.EnterMode == 'p' ? 'p' : 'div');
                                FCKDomTools.MoveChildren(B.removeChild(A), O);
                                FCKDomTools.InsertAfterNode(B, O);
                                if (FCKConfig.EnterMode == 'br')
                                {
                                        if (FCKBrowserInfo.IsGecko) O.parentNode.insertBefore(FCKTools.CreateBogusBR(C), O);
                                        else FCKDomTools.InsertAfterNode(O, FCKTools.CreateBogusBR(C));
                                        FCKDomTools.RemoveNode(O, true);
                                }
                        };
                        if (this.CheckEmptyList(B)) FCKDomTools.RemoveNode(B, true);
                }
        },
        CheckEmptyList: function (A)
        {
                return (FCKDomTools.GetFirstChild(A, 'LI') == null);
        },
        CheckListHasContents: function (A)
        {
                var B = A.firstChild;
                while (B)
                {
                        switch (B.nodeType)
                        {
                        case 1:
                                if (!B.nodeName.IEquals('UL', 'LI')) return true;
                                break;
                        case 3:
                                if (B.nodeValue.Trim().length > 0) return true;
                        };
                        B = B.nextSibling;
                };
                return false;
        }
};
var FCKElementPath = function (A)
        {
                var B = null;
                var C = null;
                var D = [];
                var e = A;
                while (e)
                {
                        if (e.nodeType == 1)
                        {
                                if (!this.LastElement) this.LastElement = e;
                                var E = e.nodeName.toLowerCase();
                                if (FCKBrowserInfo.IsIE && e.scopeName != 'HTML') E = e.scopeName.toLowerCase() + ':' + E;
                                if (!C)
                                {
                                        if (!B && FCKListsLib.PathBlockElements[E] != null) B = e;
                                        if (FCKListsLib.PathBlockLimitElements[E] != null)
                                        {
                                                if (!B && E == 'div' && !FCKElementPath._CheckHasBlock(e)) B = e;
                                                else C = e;
                                        }
                                };
                                D.push(e);
                                if (E == 'body') break;
                        };
                        e = e.parentNode;
                };
                this.Block = B;
                this.BlockLimit = C;
                this.Elements = D;
        };
FCKElementPath._CheckHasBlock = function (A)
{
        var B = A.childNodes;
        for (var i = 0, count = B.length; i < count; i++)
        {
                var C = B[i];
                if (C.nodeType == 1 && FCKListsLib.BlockElements[C.nodeName.toLowerCase()]) return true;
        };
        return false;
};
var FCKDomRange = function (A)
        {
                this.Window = A;
                this._Cache = {};
        };
FCKDomRange.prototype = {
        _UpdateElementInfo: function ()
        {
                var A = this._Range;
                if (!A) this.Release(true);
                else
                {
                        var B = A.startContainer;
                        var C = new FCKElementPath(B);
                        this.StartNode = B.nodeType == 3 ? B : B.childNodes[A.startOffset];
                        this.StartContainer = B;
                        this.StartBlock = C.Block;
                        this.StartBlockLimit = C.BlockLimit;
                        if (A.collapsed)
                        {
                                this.EndNode = this.StartNode;
                                this.EndContainer = this.StartContainer;
                                this.EndBlock = this.StartBlock;
                                this.EndBlockLimit = this.StartBlockLimit;
                        }
                        else
                        {
                                var D = A.endContainer;
                                if (B != D) C = new FCKElementPath(D);
                                var E = D;
                                if (A.endOffset == 0)
                                {
                                        while (E && !E.previousSibling) E = E.parentNode;
                                        if (E) E = E.previousSibling;
                                }
                                else if (E.nodeType == 1) E = E.childNodes[A.endOffset - 1];
                                this.EndNode = E;
                                this.EndContainer = D;
                                this.EndBlock = C.Block;
                                this.EndBlockLimit = C.BlockLimit;
                        }
                };
                this._Cache = {};
        },
        CreateRange: function ()
        {
                return new FCKW3CRange(this.Window.document);
        },
        DeleteContents: function ()
        {
                if (this._Range)
                {
                        this._Range.deleteContents();
                        this._UpdateElementInfo();
                }
        },
        ExtractContents: function ()
        {
                if (this._Range)
                {
                        var A = this._Range.extractContents();
                        this._UpdateElementInfo();
                        return A;
                };
                return null;
        },
        CheckIsCollapsed: function ()
        {
                if (this._Range) return this._Range.collapsed;
                return false;
        },
        Collapse: function (A)
        {
                if (this._Range) this._Range.collapse(A);
                this._UpdateElementInfo();
        },
        Clone: function ()
        {
                var A = FCKTools.CloneObject(this);
                if (this._Range) A._Range = this._Range.cloneRange();
                return A;
        },
        MoveToNodeContents: function (A)
        {
                if (!this._Range) this._Range = this.CreateRange();
                this._Range.selectNodeContents(A);
                this._UpdateElementInfo();
        },
        MoveToElementStart: function (A)
        {
                this.SetStart(A, 1);
                this.SetEnd(A, 1);
        },
        MoveToElementEditStart: function (A)
        {
                var B;
                while (A && A.nodeType == 1)
                {
                        if (FCKDomTools.CheckIsEditable(A)) B = A;
                        else if (B) break;
                        A = A.firstChild;
                };
                if (B) this.MoveToElementStart(B);
        },
        InsertNode: function (A)
        {
                if (this._Range) this._Range.insertNode(A);
        },
        CheckIsEmpty: function ()
        {
                if (this.CheckIsCollapsed()) return true;
                var A = this.Window.document.createElement('div');
                this._Range.cloneContents().AppendTo(A);
                FCKDomTools.TrimNode(A);
                return (A.innerHTML.length == 0);
        },
        CheckStartOfBlock: function ()
        {
                var A = this._Cache;
                var B = A.IsStartOfBlock;
                if (B != undefined) return B;
                var C = this.StartBlock || this.StartBlockLimit;
                var D = this._Range.startContainer;
                var E = this._Range.startOffset;
                var F;
                if (E > 0)
                {
                        if (D.nodeType == 3)
                        {
                                var G = D.nodeValue.substr(0, E).Trim();
                                if (G.length != 0) return A.IsStartOfBlock = false;
                        }
                        else F = D.childNodes[E - 1];
                };
                if (!F) F = FCKDomTools.GetPreviousSourceNode(D, true, null, C);
                while (F)
                {
                        switch (F.nodeType)
                        {
                        case 1:
                                if (!FCKListsLib.InlineChildReqElements[F.nodeName.toLowerCase()]) return A.IsStartOfBlock = false;
                                break;
                        case 3:
                                if (F.nodeValue.Trim().length > 0) return A.IsStartOfBlock = false;
                        };
                        F = FCKDomTools.GetPreviousSourceNode(F, false, null, C);
                };
                return A.IsStartOfBlock = true;
        },
        CheckEndOfBlock: function (A)
        {
                var B = this._Cache.IsEndOfBlock;
                if (B != undefined) return B;
                var C = this.EndBlock || this.EndBlockLimit;
                var D = this._Range.endContainer;
                var E = this._Range.endOffset;
                var F;
                if (D.nodeType == 3)
                {
                        var G = D.nodeValue;
                        if (E < G.length)
                        {
                                G = G.substr(E);
                                if (G.Trim().length != 0) return this._Cache.IsEndOfBlock = false;
                        }
                }
                else F = D.childNodes[E];
                if (!F) F = FCKDomTools.GetNextSourceNode(D, true, null, C);
                var H = false;
                while (F)
                {
                        switch (F.nodeType)
                        {
                        case 1:
                                var I = F.nodeName.toLowerCase();
                                if (FCKListsLib.InlineChildReqElements[I]) break;
                                if (I == 'br' && !H)
                                {
                                        H = true;
                                        break;
                                };
                                return this._Cache.IsEndOfBlock = false;
                        case 3:
                                if (F.nodeValue.Trim().length > 0) return this._Cache.IsEndOfBlock = false;
                        };
                        F = FCKDomTools.GetNextSourceNode(F, false, null, C);
                };
                if (A) this.Select();
                return this._Cache.IsEndOfBlock = true;
        },
        CreateBookmark: function (A)
        {
                var B = {
                        StartId: (new Date()).valueOf() + Math.floor(Math.random() * 1000) + 'S',
                        EndId: (new Date()).valueOf() + Math.floor(Math.random() * 1000) + 'E'
                };
                var C = this.Window.document;
                var D;
                var E;
                var F;
                if (!this.CheckIsCollapsed())
                {
                        E = C.createElement('span');
                        E.style.display = 'none';
                        E.id = B.EndId;
                        E.setAttribute('_fck_bookmark', true);
                        E.innerHTML = '&nbsp;';
                        F = this.Clone();
                        F.Collapse(false);
                        F.InsertNode(E);
                };
                D = C.createElement('span');
                D.style.display = 'none';
                D.id = B.StartId;
                D.setAttribute('_fck_bookmark', true);
                D.innerHTML = '&nbsp;';
                F = this.Clone();
                F.Collapse(true);
                F.InsertNode(D);
                if (A)
                {
                        B.StartNode = D;
                        B.EndNode = E;
                };
                if (E)
                {
                        this.SetStart(D, 4);
                        this.SetEnd(E, 3);
                }
                else this.MoveToPosition(D, 4);
                return B;
        },
        GetBookmarkNode: function (A, B)
        {
                var C = this.Window.document;
                if (B) return A.StartNode || C.getElementById(A.StartId);
                else return A.EndNode || C.getElementById(A.EndId);
        },
        MoveToBookmark: function (A, B)
        {
                var C = this.GetBookmarkNode(A, true);
                var D = this.GetBookmarkNode(A, false);
                this.SetStart(C, 3);
                if (!B) FCKDomTools.RemoveNode(C);
                if (D)
                {
                        this.SetEnd(D, 3);
                        if (!B) FCKDomTools.RemoveNode(D);
                }
                else this.Collapse(true);
                this._UpdateElementInfo();
        },
        CreateBookmark2: function ()
        {
                if (!this._Range) return {
                        "Start": 0,
                        "End": 0
                };
                var A = {
                        "Start": [this._Range.startOffset],
                        "End": [this._Range.endOffset]
                };
                var B = this._Range.startContainer.previousSibling;
                var C = this._Range.endContainer.previousSibling;
                var D = this._Range.startContainer;
                var E = this._Range.endContainer;
                while (B && B.nodeType == 3 && D.nodeType == 3)
                {
                        A.Start[0] += B.length;
                        D = B;
                        B = B.previousSibling;
                }
                while (C && C.nodeType == 3 && E.nodeType == 3)
                {
                        A.End[0] += C.length;
                        E = C;
                        C = C.previousSibling;
                };
                if (D.nodeType == 1 && D.childNodes[A.Start[0]] && D.childNodes[A.Start[0]].nodeType == 3)
                {
                        var F = D.childNodes[A.Start[0]];
                        var G = 0;
                        while (F.previousSibling && F.previousSibling.nodeType == 3)
                        {
                                F = F.previousSibling;
                                G += F.length;
                        };
                        D = F;
                        A.Start[0] = G;
                };
                if (E.nodeType == 1 && E.childNodes[A.End[0]] && E.childNodes[A.End[0]].nodeType == 3)
                {
                        var F = E.childNodes[A.End[0]];
                        var G = 0;
                        while (F.previousSibling && F.previousSibling.nodeType == 3)
                        {
                                F = F.previousSibling;
                                G += F.length;
                        };
                        E = F;
                        A.End[0] = G;
                };
                A.Start = FCKDomTools.GetNodeAddress(D, true).concat(A.Start);
                A.End = FCKDomTools.GetNodeAddress(E, true).concat(A.End);
                return A;
        },
        MoveToBookmark2: function (A)
        {
                var B = FCKDomTools.GetNodeFromAddress(this.Window.document, A.Start.slice(0, -1), true);
                var C = FCKDomTools.GetNodeFromAddress(this.Window.document, A.End.slice(0, -1), true);
                this.Release(true);
                this._Range = new FCKW3CRange(this.Window.document);
                var D = A.Start[A.Start.length - 1];
                var E = A.End[A.End.length - 1];
                while (B.nodeType == 3 && D > B.length)
                {
                        if (!B.nextSibling || B.nextSibling.nodeType != 3) break;
                        D -= B.length;
                        B = B.nextSibling;
                }
                while (C.nodeType == 3 && E > C.length)
                {
                        if (!C.nextSibling || C.nextSibling.nodeType != 3) break;
                        E -= C.length;
                        C = C.nextSibling;
                };
                this._Range.setStart(B, D);
                this._Range.setEnd(C, E);
                this._UpdateElementInfo();
        },
        MoveToPosition: function (A, B)
        {
                this.SetStart(A, B);
                this.Collapse(true);
        },
        SetStart: function (A, B, C)
        {
                var D = this._Range;
                if (!D) D = this._Range = this.CreateRange();
                switch (B)
                {
                case 1:
                        D.setStart(A, 0);
                        break;
                case 2:
                        D.setStart(A, A.childNodes.length);
                        break;
                case 3:
                        D.setStartBefore(A);
                        break;
                case 4:
                        D.setStartAfter(A);
                };
                if (!C) this._UpdateElementInfo();
        },
        SetEnd: function (A, B, C)
        {
                var D = this._Range;
                if (!D) D = this._Range = this.CreateRange();
                switch (B)
                {
                case 1:
                        D.setEnd(A, 0);
                        break;
                case 2:
                        D.setEnd(A, A.childNodes.length);
                        break;
                case 3:
                        D.setEndBefore(A);
                        break;
                case 4:
                        D.setEndAfter(A);
                };
                if (!C) this._UpdateElementInfo();
        },
        Expand: function (A)
        {
                var B, oSibling;
                switch (A)
                {
                case 'inline_elements':
                        if (this._Range.startOffset == 0)
                        {
                                B = this._Range.startContainer;
                                if (B.nodeType != 1) B = B.previousSibling ? null : B.parentNode;
                                if (B)
                                {
                                        while (FCKListsLib.InlineNonEmptyElements[B.nodeName.toLowerCase()])
                                        {
                                                this._Range.setStartBefore(B);
                                                if (B != B.parentNode.firstChild) break;
                                                B = B.parentNode;
                                        }
                                }
                        };
                        B = this._Range.endContainer;
                        var C = this._Range.endOffset;
                        if ((B.nodeType == 3 && C >= B.nodeValue.length) || (B.nodeType == 1 && C >= B.childNodes.length) || (B.nodeType != 1 && B.nodeType != 3))
                        {
                                if (B.nodeType != 1) B = B.nextSibling ? null : B.parentNode;
                                if (B)
                                {
                                        while (FCKListsLib.InlineNonEmptyElements[B.nodeName.toLowerCase()])
                                        {
                                                this._Range.setEndAfter(B);
                                                if (B != B.parentNode.lastChild) break;
                                                B = B.parentNode;
                                        }
                                }
                        };
                        break;
                case 'block_contents':
                case 'list_contents':
                        var D = FCKListsLib.BlockBoundaries;
                        if (A == 'list_contents' || FCKConfig.EnterMode == 'br') D = FCKListsLib.ListBoundaries;
                        if (this.StartBlock && FCKConfig.EnterMode != 'br' && A == 'block_contents') this.SetStart(this.StartBlock, 1);
                        else
                        {
                                B = this._Range.startContainer;
                                if (B.nodeType == 1)
                                {
                                        var E = B.childNodes[this._Range.startOffset];
                                        if (E) B = FCKDomTools.GetPreviousSourceNode(E, true);
                                        else B = B.lastChild || B;
                                }
                                while (B && (B.nodeType != 1 || (B != this.StartBlockLimit && !D[B.nodeName.toLowerCase()])))
                                {
                                        this._Range.setStartBefore(B);
                                        B = B.previousSibling || B.parentNode;
                                }
                        };
                        if (this.EndBlock && FCKConfig.EnterMode != 'br' && A == 'block_contents' && this.EndBlock.nodeName.toLowerCase() != 'li') this.SetEnd(this.EndBlock, 2);
                        else
                        {
                                B = this._Range.endContainer;
                                if (B.nodeType == 1) B = B.childNodes[this._Range.endOffset] || B.lastChild;
                                while (B && (B.nodeType != 1 || (B != this.StartBlockLimit && !D[B.nodeName.toLowerCase()])))
                                {
                                        this._Range.setEndAfter(B);
                                        B = B.nextSibling || B.parentNode;
                                };
                                if (B && B.nodeName.toLowerCase() == 'br') this._Range.setEndAfter(B);
                        };
                        this._UpdateElementInfo();
                }
        },
        SplitBlock: function (A)
        {
                var B = A || FCKConfig.EnterMode;
                if (!this._Range) this.MoveToSelection();
                if (this.StartBlockLimit == this.EndBlockLimit)
                {
                        var C = this.StartBlock;
                        var D = this.EndBlock;
                        var E = null;
                        if (B != 'br')
                        {
                                if (!C)
                                {
                                        C = this.FixBlock(true, B);
                                        D = this.EndBlock;
                                };
                                if (!D) D = this.FixBlock(false, B);
                        };
                        var F = (C != null && this.CheckStartOfBlock());
                        var G = (D != null && this.CheckEndOfBlock());
                        if (!this.CheckIsEmpty()) this.DeleteContents();
                        if (C && D && C == D)
                        {
                                if (G)
                                {
                                        E = new FCKElementPath(this.StartContainer);
                                        this.MoveToPosition(D, 4);
                                        D = null;
                                }
                                else if (F)
                                {
                                        E = new FCKElementPath(this.StartContainer);
                                        this.MoveToPosition(C, 3);
                                        C = null;
                                }
                                else
                                {
                                        this.SetEnd(C, 2);
                                        var H = this.ExtractContents();
                                        D = C.cloneNode(false);
                                        D.removeAttribute('id', false);
                                        H.AppendTo(D);
                                        FCKDomTools.InsertAfterNode(C, D);
                                        this.MoveToPosition(C, 4);
                                        if (FCKBrowserInfo.IsGecko && !C.nodeName.IEquals(['ul', 'ol'])) FCKTools.AppendBogusBr(C);
                                }
                        };
                        return {
                                PreviousBlock: C,
                                NextBlock: D,
                                WasStartOfBlock: F,
                                WasEndOfBlock: G,
                                ElementPath: E
                        };
                };
                return null;
        },
        FixBlock: function (A, B)
        {
                var C = this.CreateBookmark();
                this.Collapse(A);
                this.Expand('block_contents');
                var D = this.Window.document.createElement(B);
                this.ExtractContents().AppendTo(D);
                FCKDomTools.TrimNode(D);
                if (FCKDomTools.CheckIsEmptyElement(D, function (element)
                {
                        return element.getAttribute('_fck_bookmark') != 'true';
                }) && FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(D);
                this.InsertNode(D);
                this.MoveToBookmark(C);
                return D;
        },
        Release: function (A)
        {
                if (!A) this.Window = null;
                this.StartNode = null;
                this.StartContainer = null;
                this.StartBlock = null;
                this.StartBlockLimit = null;
                this.EndNode = null;
                this.EndContainer = null;
                this.EndBlock = null;
                this.EndBlockLimit = null;
                this._Range = null;
                this._Cache = null;
        },
        CheckHasRange: function ()
        {
                return !!this._Range;
        },
        GetTouchedStartNode: function ()
        {
                var A = this._Range;
                var B = A.startContainer;
                if (A.collapsed || B.nodeType != 1) return B;
                return B.childNodes[A.startOffset] || B;
        },
        GetTouchedEndNode: function ()
        {
                var A = this._Range;
                var B = A.endContainer;
                if (A.collapsed || B.nodeType != 1) return B;
                return B.childNodes[A.endOffset - 1] || B;
        }
};
FCKDomRange.prototype.MoveToSelection = function ()
{
        this.Release(true);
        this._Range = new FCKW3CRange(this.Window.document);
        var A = this.Window.document.selection;
        if (A.type != 'Control')
        {
                var B = this._GetSelectionMarkerTag(true);
                var C = this._GetSelectionMarkerTag(false);
                if (!B && !C)
                {
                        this._Range.setStart(this.Window.document.body, 0);
                        this._UpdateElementInfo();
                        return;
                };
                this._Range.setStart(B.parentNode, FCKDomTools.GetIndexOf(B));
                B.parentNode.removeChild(B);
                this._Range.setEnd(C.parentNode, FCKDomTools.GetIndexOf(C));
                C.parentNode.removeChild(C);
                this._UpdateElementInfo();
        }
        else
        {
                var D = A.createRange().item(0);
                if (D)
                {
                        this._Range.setStartBefore(D);
                        this._Range.setEndAfter(D);
                        this._UpdateElementInfo();
                }
        }
};
FCKDomRange.prototype.Select = function (A)
{
        if (this._Range) this.SelectBookmark(this.CreateBookmark(true), A);
};
FCKDomRange.prototype.SelectBookmark = function (A, B)
{
        var C = this.CheckIsCollapsed();
        var D;
        var E;
        var F = this.GetBookmarkNode(A, true);
        if (!F) return;
        var G;
        if (!C) G = this.GetBookmarkNode(A, false);
        var H = this.Window.document.body.createTextRange();
        H.moveToElementText(F);
        H.moveStart('character', 1);
        if (G)
        {
                var I = this.Window.document.body.createTextRange();
                I.moveToElementText(G);
                H.setEndPoint('EndToEnd', I);
                H.moveEnd('character', -1);
        }
        else
        {
                D = B || !F.previousSibling || F.previousSibling.nodeName.toLowerCase() == 'br';
                E = this.Window.document.createElement('span');
                E.innerHTML = '&#65279;';
                F.parentNode.insertBefore(E, F);
                if (D)
                {
                        F.parentNode.insertBefore(this.Window.document.createTextNode('\ufeff'), F);
                }
        };
        if (!this._Range) this._Range = this.CreateRange();
        this._Range.setStartBefore(F);
        F.parentNode.removeChild(F);
        if (C)
        {
                if (D)
                {
                        H.moveStart('character', -1);
                        H.select();
                        this.Window.document.selection.clear();
                }
                else H.select();
                FCKDomTools.RemoveNode(E);
        }
        else
        {
                this._Range.setEndBefore(G);
                G.parentNode.removeChild(G);
                H.select();
        }
};
FCKDomRange.prototype._GetSelectionMarkerTag = function (A)
{
        var B = this.Window.document;
        var C = B.selection;
        var D;
        try
        {
                D = C.createRange();
        }
        catch (e)
        {
                return null;
        };
        if (D.parentElement().document != B) return null;
        D.collapse(A === true);
        var E = 'fck_dom_range_temp_' + (new Date()).valueOf() + '_' + Math.floor(Math.random() * 1000);
        D.pasteHTML('<span id="' + E + '"></span>');
        return B.getElementById(E);
};
var FCKDomRangeIterator = function (A)
        {
                this.Range = A;
                this.ForceBrBreak = false;
                this.EnforceRealBlocks = false;
        };
FCKDomRangeIterator.CreateFromSelection = function (A)
{
        var B = new FCKDomRange(A);
        B.MoveToSelection();
        return new FCKDomRangeIterator(B);
};
FCKDomRangeIterator.prototype = {
        GetNextParagraph: function ()
        {
                var A;
                var B;
                var C;
                var D;
                var E;
                var F = this.ForceBrBreak ? FCKListsLib.ListBoundaries : FCKListsLib.BlockBoundaries;
                if (!this._LastNode)
                {
                        var B = this.Range.Clone();
                        B.Expand(this.ForceBrBreak ? 'list_contents' : 'block_contents');
                        this._NextNode = B.GetTouchedStartNode();
                        this._LastNode = B.GetTouchedEndNode();
                        B = null;
                };
                var H = this._NextNode;
                var I = this._LastNode;
                this._NextNode = null;
                while (H)
                {
                        var J = false;
                        var K = (H.nodeType != 1);
                        var L = false;
                        if (!K)
                        {
                                var M = H.nodeName.toLowerCase();
                                if (F[M] && (!FCKBrowserInfo.IsIE || H.scopeName == 'HTML'))
                                {
                                        if (M == 'br') K = true;
                                        else if (!B && H.childNodes.length == 0 && M != 'hr')
                                        {
                                                A = H;
                                                C = H == I;
                                                break;
                                        };
                                        if (B)
                                        {
                                                B.SetEnd(H, 3, true);
                                                if (M != 'br') this._NextNode = FCKDomTools.GetNextSourceNode(H, true, null, I) || H;
                                        };
                                        J = true;
                                }
                                else
                                {
                                        if (H.firstChild)
                                        {
                                                if (!B)
                                                {
                                                        B = new FCKDomRange(this.Range.Window);
                                                        B.SetStart(H, 3, true);
                                                };
                                                H = H.firstChild;
                                                continue;
                                        };
                                        K = true;
                                }
                        }
                        else if (H.nodeType == 3)
                        {
                                if (/^[\r\n\t ]+$/.test(H.nodeValue)) K = false;
                        };
                        if (K && !B)
                        {
                                B = new FCKDomRange(this.Range.Window);
                                B.SetStart(H, 3, true);
                        };
                        C = ((!J || K) && H == I);
                        if (B && !J)
                        {
                                while (!H.nextSibling && !C)
                                {
                                        var N = H.parentNode;
                                        if (F[N.nodeName.toLowerCase()])
                                        {
                                                J = true;
                                                C = C || (N == I);
                                                break;
                                        };
                                        H = N;
                                        K = true;
                                        C = (H == I);
                                        L = true;
                                }
                        };
                        if (K) B.SetEnd(H, 4, true);
                        if ((J || C) && B)
                        {
                                B._UpdateElementInfo();
                                if (B.StartNode == B.EndNode && B.StartNode.parentNode == B.StartBlockLimit && B.StartNode.getAttribute && B.StartNode.getAttribute('_fck_bookmark')) B = null;
                                else break;
                        };
                        if (C) break;
                        H = FCKDomTools.GetNextSourceNode(H, L, null, I);
                };
                if (!A)
                {
                        if (!B)
                        {
                                this._NextNode = null;
                                return null;
                        };
                        A = B.StartBlock;
                        if (!A && !this.EnforceRealBlocks && B.StartBlockLimit.nodeName.IEquals('DIV', 'TH', 'TD') && B.CheckStartOfBlock() && B.CheckEndOfBlock())
                        {
                                A = B.StartBlockLimit;
                        }
                        else if (!A || (this.EnforceRealBlocks && A.nodeName.toLowerCase() == 'li'))
                        {
                                A = this.Range.Window.document.createElement(FCKConfig.EnterMode == 'p' ? 'p' : 'div');
                                B.ExtractContents().AppendTo(A);
                                FCKDomTools.TrimNode(A);
                                B.InsertNode(A);
                                D = true;
                                E = true;
                        }
                        else if (A.nodeName.toLowerCase() != 'li')
                        {
                                if (!B.CheckStartOfBlock() || !B.CheckEndOfBlock())
                                {
                                        A = A.cloneNode(false);
                                        B.ExtractContents().AppendTo(A);
                                        FCKDomTools.TrimNode(A);
                                        var O = B.SplitBlock();
                                        D = !O.WasStartOfBlock;
                                        E = !O.WasEndOfBlock;
                                        B.InsertNode(A);
                                }
                        }
                        else if (!C)
                        {
                                this._NextNode = A == I ? null : FCKDomTools.GetNextSourceNode(B.EndNode, true, null, I);
                                return A;
                        }
                };
                if (D)
                {
                        var P = A.previousSibling;
                        if (P && P.nodeType == 1)
                        {
                                if (P.nodeName.toLowerCase() == 'br') P.parentNode.removeChild(P);
                                else if (P.lastChild && P.lastChild.nodeName.IEquals('br')) P.removeChild(P.lastChild);
                        }
                };
                if (E)
                {
                        var Q = A.lastChild;
                        if (Q && Q.nodeType == 1 && Q.nodeName.toLowerCase() == 'br') A.removeChild(Q);
                };
                if (!this._NextNode) this._NextNode = (C || A == I) ? null : FCKDomTools.GetNextSourceNode(A, true, null, I);
                return A;
        }
};
var FCKDocumentFragment = function (A)
        {
                this._Document = A;
                this.RootNode = A.createElement('div');
        };
FCKDocumentFragment.prototype = {
        AppendTo: function (A)
        {
                FCKDomTools.MoveChildren(this.RootNode, A);
        },
        AppendHtml: function (A)
        {
                var B = this._Document.createElement('div');
                B.innerHTML = A;
                FCKDomTools.MoveChildren(B, this.RootNode);
        },
        InsertAfterNode: function (A)
        {
                var B = this.RootNode;
                var C;
                while ((C = B.lastChild)) FCKDomTools.InsertAfterNode(A, B.removeChild(C));
        }
};
var FCKW3CRange = function (A)
        {
                this._Document = A;
                this.startContainer = null;
                this.startOffset = null;
                this.endContainer = null;
                this.endOffset = null;
                this.collapsed = true;
        };
FCKW3CRange.CreateRange = function (A)
{
        return new FCKW3CRange(A);
};
FCKW3CRange.CreateFromRange = function (A, B)
{
        var C = FCKW3CRange.CreateRange(A);
        C.setStart(B.startContainer, B.startOffset);
        C.setEnd(B.endContainer, B.endOffset);
        return C;
};
FCKW3CRange.prototype = {
        _UpdateCollapsed: function ()
        {
                this.collapsed = (this.startContainer == this.endContainer && this.startOffset == this.endOffset);
        },
        setStart: function (A, B)
        {
                this.startContainer = A;
                this.startOffset = B;
                if (!this.endContainer)
                {
                        this.endContainer = A;
                        this.endOffset = B;
                };
                this._UpdateCollapsed();
        },
        setEnd: function (A, B)
        {
                this.endContainer = A;
                this.endOffset = B;
                if (!this.startContainer)
                {
                        this.startContainer = A;
                        this.startOffset = B;
                };
                this._UpdateCollapsed();
        },
        setStartAfter: function (A)
        {
                this.setStart(A.parentNode, FCKDomTools.GetIndexOf(A) + 1);
        },
        setStartBefore: function (A)
        {
                this.setStart(A.parentNode, FCKDomTools.GetIndexOf(A));
        },
        setEndAfter: function (A)
        {
                this.setEnd(A.parentNode, FCKDomTools.GetIndexOf(A) + 1);
        },
        setEndBefore: function (A)
        {
                this.setEnd(A.parentNode, FCKDomTools.GetIndexOf(A));
        },
        collapse: function (A)
        {
                if (A)
                {
                        this.endContainer = this.startContainer;
                        this.endOffset = this.startOffset;
                }
                else
                {
                        this.startContainer = this.endContainer;
                        this.startOffset = this.endOffset;
                };
                this.collapsed = true;
        },
        selectNodeContents: function (A)
        {
                this.setStart(A, 0);
                this.setEnd(A, A.nodeType == 3 ? A.data.length : A.childNodes.length);
        },
        insertNode: function (A)
        {
                var B = this.startContainer;
                var C = this.startOffset;
                if (B.nodeType == 3)
                {
                        B.splitText(C);
                        if (B == this.endContainer) this.setEnd(B.nextSibling, this.endOffset - this.startOffset);
                        FCKDomTools.InsertAfterNode(B, A);
                        return;
                }
                else
                {
                        B.insertBefore(A, B.childNodes[C] || null);
                        if (B == this.endContainer)
                        {
                                this.endOffset++;
                                this.collapsed = false;
                        }
                }
        },
        deleteContents: function ()
        {
                if (this.collapsed) return;
                this._ExecContentsAction(0);
        },
        extractContents: function ()
        {
                var A = new FCKDocumentFragment(this._Document);
                if (!this.collapsed) this._ExecContentsAction(1, A);
                return A;
        },
        cloneContents: function ()
        {
                var A = new FCKDocumentFragment(this._Document);
                if (!this.collapsed) this._ExecContentsAction(2, A);
                return A;
        },
        _ExecContentsAction: function (A, B)
        {
                var C = this.startContainer;
                var D = this.endContainer;
                var E = this.startOffset;
                var F = this.endOffset;
                var G = false;
                var H = false;
                if (D.nodeType == 3) D = D.splitText(F);
                else
                {
                        if (D.childNodes.length > 0)
                        {
                                if (F > D.childNodes.length - 1)
                                {
                                        D = FCKDomTools.InsertAfterNode(D.lastChild, this._Document.createTextNode(''));
                                        H = true;
                                }
                                else D = D.childNodes[F];
                        }
                };
                if (C.nodeType == 3)
                {
                        C.splitText(E);
                        if (C == D) D = C.nextSibling;
                }
                else
                {
                        if (E == 0)
                        {
                                C = C.insertBefore(this._Document.createTextNode(''), C.firstChild);
                                G = true;
                        }
                        else if (E > C.childNodes.length - 1)
                        {
                                C = C.appendChild(this._Document.createTextNode(''));
                                G = true;
                        }
                        else C = C.childNodes[E].previousSibling;
                };
                var I = FCKDomTools.GetParents(C);
                var J = FCKDomTools.GetParents(D);
                var i, topStart, topEnd;
                for (i = 0; i < I.length; i++)
                {
                        topStart = I[i];
                        topEnd = J[i];
                        if (topStart != topEnd) break;
                };
                var K, levelStartNode, levelClone, currentNode, currentSibling;
                if (B) K = B.RootNode;
                for (var j = i; j < I.length; j++)
                {
                        levelStartNode = I[j];
                        if (K && levelStartNode != C) levelClone = K.appendChild(levelStartNode.cloneNode(levelStartNode == C));
                        currentNode = levelStartNode.nextSibling;
                        while (currentNode)
                        {
                                if (currentNode == J[j] || currentNode == D) break;
                                currentSibling = currentNode.nextSibling;
                                if (A == 2) K.appendChild(currentNode.cloneNode(true));
                                else
                                {
                                        currentNode.parentNode.removeChild(currentNode);
                                        if (A == 1) K.appendChild(currentNode);
                                };
                                currentNode = currentSibling;
                        };
                        if (K) K = levelClone;
                };
                if (B) K = B.RootNode;
                for (var k = i; k < J.length; k++)
                {
                        levelStartNode = J[k];
                        if (A > 0 && levelStartNode != D) levelClone = K.appendChild(levelStartNode.cloneNode(levelStartNode == D));
                        if (!I[k] || levelStartNode.parentNode != I[k].parentNode)
                        {
                                currentNode = levelStartNode.previousSibling;
                                while (currentNode)
                                {
                                        if (currentNode == I[k] || currentNode == C) break;
                                        currentSibling = currentNode.previousSibling;
                                        if (A == 2) K.insertBefore(currentNode.cloneNode(true), K.firstChild);
                                        else
                                        {
                                                currentNode.parentNode.removeChild(currentNode);
                                                if (A == 1) K.insertBefore(currentNode, K.firstChild);
                                        };
                                        currentNode = currentSibling;
                                }
                        };
                        if (K) K = levelClone;
                };
                if (A == 2)
                {
                        var L = this.startContainer;
                        if (L.nodeType == 3)
                        {
                                L.data += L.nextSibling.data;
                                L.parentNode.removeChild(L.nextSibling);
                        };
                        var M = this.endContainer;
                        if (M.nodeType == 3 && M.nextSibling)
                        {
                                M.data += M.nextSibling.data;
                                M.parentNode.removeChild(M.nextSibling);
                        }
                }
                else
                {
                        if (topStart && topEnd && (C.parentNode != topStart.parentNode || D.parentNode != topEnd.parentNode))
                        {
                                var N = FCKDomTools.GetIndexOf(topEnd);
                                if (G && topEnd.parentNode == C.parentNode) N--;
                                this.setStart(topEnd.parentNode, N);
                        };
                        this.collapse(true);
                };
                if (G) C.parentNode.removeChild(C);
                if (H && D.parentNode) D.parentNode.removeChild(D);
        },
        cloneRange: function ()
        {
                return FCKW3CRange.CreateFromRange(this._Document, this);
        }
};
var FCKEnterKey = function (A, B, C, D)
        {
                this.Window = A;
                this.EnterMode = B || 'p';
                this.ShiftEnterMode = C || 'br';
                var E = new FCKKeystrokeHandler(false);
                E._EnterKey = this;
                E.OnKeystroke = FCKEnterKey_OnKeystroke;
                E.SetKeystrokes([
                        [13, 'Enter'],
                        [SHIFT + 13, 'ShiftEnter'],
                        [8, 'Backspace'],
                        [CTRL + 8, 'CtrlBackspace'],
                        [46, 'Delete']
                ]);
                this.TabText = '';
                if (D > 0 || FCKBrowserInfo.IsSafari)
                {
                        while (D--) this.TabText += '\xa0';
                        E.SetKeystrokes([9, 'Tab']);
                };
                E.AttachToElement(A.document);
        };

function FCKEnterKey_OnKeystroke(A, B)
{
        var C = this._EnterKey;
        try
        {
                switch (B)
                {
                case 'Enter':
                        return C.DoEnter();
                        break;
                case 'ShiftEnter':
                        return C.DoShiftEnter();
                        break;
                case 'Backspace':
                        return C.DoBackspace();
                        break;
                case 'Delete':
                        return C.DoDelete();
                        break;
                case 'Tab':
                        return C.DoTab();
                        break;
                case 'CtrlBackspace':
                        return C.DoCtrlBackspace();
                        break;
                }
        }
        catch (e)
        {};
        return false;
};
FCKEnterKey.prototype.DoEnter = function (A, B)
{
        FCKUndo.SaveUndoStep();
        this._HasShift = (B === true);
        var C = FCKSelection.GetParentElement();
        var D = new FCKElementPath(C);
        var E = A || this.EnterMode;
        if (E == 'br' || D.Block && D.Block.tagName.toLowerCase() == 'pre') return this._ExecuteEnterBr();
        else return this._ExecuteEnterBlock(E);
};
FCKEnterKey.prototype.DoShiftEnter = function ()
{
        return this.DoEnter(this.ShiftEnterMode, true);
};
FCKEnterKey.prototype.DoBackspace = function ()
{
        var A = false;
        var B = new FCKDomRange(this.Window);
        B.MoveToSelection();
        if (FCKBrowserInfo.IsIE && this._CheckIsAllContentsIncluded(B, this.Window.document.body))
        {
                this._FixIESelectAllBug(B);
                return true;
        };
        var C = B.CheckIsCollapsed();
        if (!C)
        {
                if (FCKBrowserInfo.IsIE && this.Window.document.selection.type.toLowerCase() == "control")
                {
                        var D = this.Window.document.selection.createRange();
                        for (var i = D.length - 1; i >= 0; i--)
                        {
                                var E = D.item(i);
                                E.parentNode.removeChild(E);
                        };
                        return true;
                };
                return false;
        };
        if (FCKBrowserInfo.IsIE)
        {
                var F = FCKDomTools.GetPreviousSourceElement(B.StartNode, true);
                if (F && F.nodeName.toLowerCase() == 'br')
                {
                        var G = B.Clone();
                        G.SetStart(F, 4);
                        if (G.CheckIsEmpty())
                        {
                                F.parentNode.removeChild(F);
                                return true;
                        }
                }
        };
        var H = B.StartBlock;
        var I = B.EndBlock;
        if (B.StartBlockLimit == B.EndBlockLimit && H && I)
        {
                if (!C)
                {
                        var J = B.CheckEndOfBlock();
                        B.DeleteContents();
                        if (H != I)
                        {
                                B.SetStart(I, 1);
                                B.SetEnd(I, 1);
                        };
                        B.Select();
                        A = (H == I);
                };
                if (B.CheckStartOfBlock())
                {
                        var K = B.StartBlock;
                        var L = FCKDomTools.GetPreviousSourceElement(K, true, ['BODY', B.StartBlockLimit.nodeName], ['UL', 'OL']);
                        A = this._ExecuteBackspace(B, L, K);
                }
                else if (FCKBrowserInfo.IsGeckoLike)
                {
                        B.Select();
                }
        };
        B.Release();
        return A;
};
FCKEnterKey.prototype.DoCtrlBackspace = function ()
{
        FCKUndo.SaveUndoStep();
        var A = new FCKDomRange(this.Window);
        A.MoveToSelection();
        if (FCKBrowserInfo.IsIE && this._CheckIsAllContentsIncluded(A, this.Window.document.body))
        {
                this._FixIESelectAllBug(A);
                return true;
        };
        return false;
};
FCKEnterKey.prototype._ExecuteBackspace = function (A, B, C)
{
        var D = false;
        if (!B && C && C.nodeName.IEquals('LI') && C.parentNode.parentNode.nodeName.IEquals('LI'))
        {
                this._OutdentWithSelection(C, A);
                return true;
        };
        if (B && B.nodeName.IEquals('LI'))
        {
                var E = FCKDomTools.GetLastChild(B, ['UL', 'OL']);
                while (E)
                {
                        B = FCKDomTools.GetLastChild(E, 'LI');
                        E = FCKDomTools.GetLastChild(B, ['UL', 'OL']);
                }
        };
        if (B && C)
        {
                if (C.nodeName.IEquals('LI') && !B.nodeName.IEquals('LI'))
                {
                        this._OutdentWithSelection(C, A);
                        return true;
                };
                var F = C.parentNode;
                var G = B.nodeName.toLowerCase();
                if (FCKListsLib.EmptyElements[G] != null || G == 'table')
                {
                        FCKDomTools.RemoveNode(B);
                        D = true;
                }
                else
                {
                        FCKDomTools.RemoveNode(C);
                        while (F.innerHTML.Trim().length == 0)
                        {
                                var H = F.parentNode;
                                H.removeChild(F);
                                F = H;
                        };
                        FCKDomTools.LTrimNode(C);
                        FCKDomTools.RTrimNode(B);
                        A.SetStart(B, 2, true);
                        A.Collapse(true);
                        var I = A.CreateBookmark(true);
                        if (!C.tagName.IEquals(['TABLE'])) FCKDomTools.MoveChildren(C, B);
                        A.SelectBookmark(I);
                        D = true;
                }
        };
        return D;
};
FCKEnterKey.prototype.DoDelete = function ()
{
        FCKUndo.SaveUndoStep();
        var A = false;
        var B = new FCKDomRange(this.Window);
        B.MoveToSelection();
        if (FCKBrowserInfo.IsIE && this._CheckIsAllContentsIncluded(B, this.Window.document.body))
        {
                this._FixIESelectAllBug(B);
                return true;
        };
        if (B.CheckIsCollapsed() && B.CheckEndOfBlock(FCKBrowserInfo.IsGeckoLike))
        {
                var C = B.StartBlock;
                var D = FCKTools.GetElementAscensor(C, 'td');
                var E = FCKDomTools.GetNextSourceElement(C, true, [B.StartBlockLimit.nodeName], ['UL', 'OL', 'TR'], true);
                if (D)
                {
                        var F = FCKTools.GetElementAscensor(E, 'td');
                        if (F != D) return true;
                };
                A = this._ExecuteBackspace(B, C, E);
        };
        B.Release();
        return A;
};
FCKEnterKey.prototype.DoTab = function ()
{
        var A = new FCKDomRange(this.Window);
        A.MoveToSelection();
        var B = A._Range.startContainer;
        while (B)
        {
                if (B.nodeType == 1)
                {
                        var C = B.tagName.toLowerCase();
                        if (C == "tr" || C == "td" || C == "th" || C == "tbody" || C == "table") return false;
                        else break;
                };
                B = B.parentNode;
        };
        if (this.TabText)
        {
                A.DeleteContents();
                A.InsertNode(this.Window.document.createTextNode(this.TabText));
                A.Collapse(false);
                A.Select();
        };
        return true;
};
FCKEnterKey.prototype._ExecuteEnterBlock = function (A, B)
{
        var C = B || new FCKDomRange(this.Window);
        var D = C.SplitBlock(A);
        if (D)
        {
                var E = D.PreviousBlock;
                var F = D.NextBlock;
                var G = D.WasStartOfBlock;
                var H = D.WasEndOfBlock;
                if (F)
                {
                        if (F.parentNode.nodeName.IEquals('li'))
                        {
                                FCKDomTools.BreakParent(F, F.parentNode);
                                FCKDomTools.MoveNode(F, F.nextSibling, true);
                        }
                }
                else if (E && E.parentNode.nodeName.IEquals('li'))
                {
                        FCKDomTools.BreakParent(E, E.parentNode);
                        C.MoveToElementEditStart(E.nextSibling);
                        FCKDomTools.MoveNode(E, E.previousSibling);
                };
                if (!G && !H)
                {
                        if (F.nodeName.IEquals('li') && F.firstChild && F.firstChild.nodeName.IEquals(['ul', 'ol'])) F.insertBefore(FCKTools.GetElementDocument(F).createTextNode('\xa0'), F.firstChild);
                        if (F) C.MoveToElementEditStart(F);
                }
                else
                {
                        if (G && H && E.tagName.toUpperCase() == 'LI')
                        {
                                C.MoveToElementStart(E);
                                this._OutdentWithSelection(E, C);
                                C.Release();
                                return true;
                        };
                        var I;
                        if (E)
                        {
                                var J = E.tagName.toUpperCase();
                                if (!this._HasShift && !(/^H[1-6]$/).test(J))
                                {
                                        I = FCKDomTools.CloneElement(E);
                                }
                        }
                        else if (F) I = FCKDomTools.CloneElement(F);
                        if (!I) I = this.Window.document.createElement(A);
                        var K = D.ElementPath;
                        if (K)
                        {
                                for (var i = 0, len = K.Elements.length; i < len; i++)
                                {
                                        var L = K.Elements[i];
                                        if (L == K.Block || L == K.BlockLimit) break;
                                        if (FCKListsLib.InlineChildReqElements[L.nodeName.toLowerCase()])
                                        {
                                                L = FCKDomTools.CloneElement(L);
                                                FCKDomTools.MoveChildren(I, L);
                                                I.appendChild(L);
                                        }
                                }
                        };
                        if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(I);
                        C.InsertNode(I);
                        if (FCKBrowserInfo.IsIE)
                        {
                                C.MoveToElementEditStart(I);
                                C.Select();
                        };
                        C.MoveToElementEditStart(G && !H ? F : I);
                };
                if (FCKBrowserInfo.IsGeckoLike)
                {
                        if (F)
                        {
                                var M = this.Window.document.createElement('span');
                                M.innerHTML = '&nbsp;';
                                C.InsertNode(M);
                                FCKDomTools.ScrollIntoView(M, false);
                                C.DeleteContents();
                        }
                        else
                        {
                                FCKDomTools.ScrollIntoView(F || I, false);
                        }
                };
                C.Select();
        };
        C.Release();
        return true;
};
FCKEnterKey.prototype._ExecuteEnterBr = function (A)
{
        var B = new FCKDomRange(this.Window);
        B.MoveToSelection();
        if (B.StartBlockLimit == B.EndBlockLimit)
        {
                B.DeleteContents();
                B.MoveToSelection();
                var C = B.CheckStartOfBlock();
                var D = B.CheckEndOfBlock();
                var E = B.StartBlock ? B.StartBlock.tagName.toUpperCase() : '';
                var F = this._HasShift;
                var G = false;
                if (!F && E == 'LI') return this._ExecuteEnterBlock(null, B);
                if (!F && D && (/^H[1-6]$/).test(E))
                {
                        FCKDomTools.InsertAfterNode(B.StartBlock, this.Window.document.createElement('br'));
                        if (FCKBrowserInfo.IsGecko) FCKDomTools.InsertAfterNode(B.StartBlock, this.Window.document.createTextNode(''));
                        B.SetStart(B.StartBlock.nextSibling, FCKBrowserInfo.IsIE ? 3 : 1);
                }
                else
                {
                        var H;
                        G = E.IEquals('pre');
                        if (G) H = this.Window.document.createTextNode(FCKBrowserInfo.IsIE ? '\r' : '\n');
                        else H = this.Window.document.createElement('br');
                        B.InsertNode(H);
                        if (FCKBrowserInfo.IsGecko) FCKDomTools.InsertAfterNode(H, this.Window.document.createTextNode(''));
                        if (D && FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(H.parentNode);
                        if (FCKBrowserInfo.IsIE) B.SetStart(H, 4);
                        else B.SetStart(H.nextSibling, 1);
                        if (!FCKBrowserInfo.IsIE)
                        {
                                var I = null;
                                if (FCKBrowserInfo.IsOpera) I = this.Window.document.createElement('span');
                                else I = this.Window.document.createElement('br');
                                H.parentNode.insertBefore(I, H.nextSibling);
                                FCKDomTools.ScrollIntoView(I, false);
                                I.parentNode.removeChild(I);
                        }
                };
                B.Collapse(true);
                B.Select(G);
        };
        B.Release();
        return true;
};
FCKEnterKey.prototype._OutdentWithSelection = function (A, B)
{
        var C = B.CreateBookmark();
        FCKListHandler.OutdentListItem(A);
        B.MoveToBookmark(C);
        B.Select();
};
FCKEnterKey.prototype._CheckIsAllContentsIncluded = function (A, B)
{
        var C = false;
        var D = false;
        if (A.StartContainer == B || A.StartContainer == B.firstChild) C = (A._Range.startOffset == 0);
        if (A.EndContainer == B || A.EndContainer == B.lastChild)
        {
                var E = A.EndContainer.nodeType == 3 ? A.EndContainer.length : A.EndContainer.childNodes.length;
                D = (A._Range.endOffset == E);
        };
        return C && D;
};
FCKEnterKey.prototype._FixIESelectAllBug = function (A)
{
        var B = this.Window.document;
        B.body.innerHTML = '';
        var C;
        if (FCKConfig.EnterMode.IEquals(['div', 'p']))
        {
                C = B.createElement(FCKConfig.EnterMode);
                B.body.appendChild(C);
        }
        else C = B.body;
        A.MoveToNodeContents(C);
        A.Collapse(true);
        A.Select();
        A.Release();
};
var FCKDocumentProcessor = {};
FCKDocumentProcessor._Items = [];
FCKDocumentProcessor.AppendNew = function ()
{
        var A = {};
        this._Items.push(A);
        return A;
};
FCKDocumentProcessor.Process = function (A)
{
        var B = FCK.IsDirty();
        var C, i = 0;
        while ((C = this._Items[i++])) C.ProcessDocument(A);
        if (!B) FCK.ResetIsDirty();
};
var FCKDocumentProcessor_CreateFakeImage = function (A, B)
        {
                var C = FCKTools.GetElementDocument(B).createElement('IMG');
                C.className = A;
                C.src = FCKConfig.BasePath + 'images/spacer.gif';
                C.setAttribute('_fckfakelement', 'true', 0);
                C.setAttribute('_fckrealelement', FCKTempBin.AddElement(B), 0);
                return C;
        };
if (FCKBrowserInfo.IsIE || FCKBrowserInfo.IsOpera)
{
        var FCKAnchorsProcessor = FCKDocumentProcessor.AppendNew();
        FCKAnchorsProcessor.ProcessDocument = function (A)
        {
                var B = A.getElementsByTagName('A');
                var C;
                var i = B.length - 1;
                while (i >= 0 && (C = B[i--]))
                {
                        if (C.name.length > 0)
                        {
                                if (C.innerHTML !== '')
                                {
                                        if (FCKBrowserInfo.IsIE) C.className += ' FCK__AnchorC';
                                }
                                else
                                {
                                        var D = FCKDocumentProcessor_CreateFakeImage('FCK__Anchor', C.cloneNode(true));
                                        D.setAttribute('_fckanchor', 'true', 0);
                                        C.parentNode.insertBefore(D, C);
                                        C.parentNode.removeChild(C);
                                }
                        }
                }
        }
};
var FCKPageBreaksProcessor = FCKDocumentProcessor.AppendNew();
FCKPageBreaksProcessor.ProcessDocument = function (A)
{
        var B = A.getElementsByTagName('DIV');
        var C;
        var i = B.length - 1;
        while (i >= 0 && (C = B[i--]))
        {
                if (C.style.pageBreakAfter == 'always' && C.childNodes.length == 1 && C.childNodes[0].style && C.childNodes[0].style.display == 'none')
                {
                        var D = FCKDocumentProcessor_CreateFakeImage('FCK__PageBreak', C.cloneNode(true));
                        C.parentNode.insertBefore(D, C);
                        C.parentNode.removeChild(C);
                }
        }
};
var FCKEmbedAndObjectProcessor = (function ()
{
        var A = [];
        var B = function (el)
                {
                        var C = el.cloneNode(true);
                        var D;
                        var E = D = FCKDocumentProcessor_CreateFakeImage('FCK__UnknownObject', C);
                        FCKEmbedAndObjectProcessor.RefreshView(E, el);
                        for (var i = 0; i < A.length; i++) D = A[i](el, D) || D;
                        if (D != E) FCKTempBin.RemoveElement(E.getAttribute('_fckrealelement'));
                        el.parentNode.replaceChild(D, el);
                };
        var F = function (elementName, doc)
                {
                        var G = doc.getElementsByTagName(elementName);
                        for (var i = G.length - 1; i >= 0; i--) B(G[i]);
                };
        var H = function (doc)
                {
                        F('object', doc);
                        F('embed', doc);
                };
        return FCKTools.Merge(FCKDocumentProcessor.AppendNew(), {
                ProcessDocument: function (doc)
                {
                        if (FCKBrowserInfo.IsGecko) FCKTools.RunFunction(H, this, [doc]);
                        else H(doc);
                },
                RefreshView: function (placeHolder, original)
                {
                        if (original.getAttribute('width') > 0) placeHolder.style.width = FCKTools.ConvertHtmlSizeToStyle(original.getAttribute('width'));
                        if (original.getAttribute('height') > 0) placeHolder.style.height = FCKTools.ConvertHtmlSizeToStyle(original.getAttribute('height'));
                },
                AddCustomHandler: function (func)
                {
                        A.push(func);
                }
        });
})();
FCK.GetRealElement = function (A)
{
        var e = FCKTempBin.Elements[A.getAttribute('_fckrealelement')];
        if (A.getAttribute('_fckflash'))
        {
                if (A.style.width.length > 0) e.width = FCKTools.ConvertStyleSizeToHtml(A.style.width);
                if (A.style.height.length > 0) e.height = FCKTools.ConvertStyleSizeToHtml(A.style.height);
        };
        return e;
};
if (FCKBrowserInfo.IsIE)
{
        FCKDocumentProcessor.AppendNew().ProcessDocument = function (A)
        {
                var B = A.getElementsByTagName('HR');
                var C;
                var i = B.length - 1;
                while (i >= 0 && (C = B[i--]))
                {
                        var D = A.createElement('hr');
                        D.mergeAttributes(C, true);
                        FCKDomTools.InsertAfterNode(C, D);
                        C.parentNode.removeChild(C);
                }
        }
};
FCKDocumentProcessor.AppendNew().ProcessDocument = function (A)
{
        var B = A.getElementsByTagName('INPUT');
        var C;
        var i = B.length - 1;
        while (i >= 0 && (C = B[i--]))
        {
                if (C.type == 'hidden')
                {
                        var D = FCKDocumentProcessor_CreateFakeImage('FCK__InputHidden', C.cloneNode(true));
                        D.setAttribute('_fckinputhidden', 'true', 0);
                        C.parentNode.insertBefore(D, C);
                        C.parentNode.removeChild(C);
                }
        }
};
FCKEmbedAndObjectProcessor.AddCustomHandler(function (A, B)
{
        if (!(A.nodeName.IEquals('embed') && (A.type == 'application/x-shockwave-flash' || /\.swf($|#|\?)/i.test(A.src)))) return;
        B.className = 'FCK__Flash';
        B.setAttribute('_fckflash', 'true', 0);
});
if (FCKBrowserInfo.IsSafari)
{
        FCKDocumentProcessor.AppendNew().ProcessDocument = function (A)
        {
                var B = A.getElementsByClassName ? A.getElementsByClassName('Apple-style-span') : Array.prototype.filter.call(A.getElementsByTagName('span'), function (item)
                {
                        return item.className == 'Apple-style-span';
                });
                for (var i = B.length - 1; i >= 0; i--) FCKDomTools.RemoveNode(B[i], true);
        }
};
var FCKSelection = FCK.Selection = {
        GetParentBlock: function ()
        {
                var A = this.GetParentElement();
                while (A)
                {
                        if (FCKListsLib.BlockBoundaries[A.nodeName.toLowerCase()]) break;
                        A = A.parentNode;
                };
                return A;
        },
        ApplyStyle: function (A)
        {
                FCKStyles.ApplyStyle(new FCKStyle(A));
        }
};
FCKSelection.GetType = function ()
{
        try
        {
                var A = FCKSelection.GetSelection().type;
                if (A == 'Control' || A == 'Text') return A;
                if (this.GetSelection().createRange().parentElement) return 'Text';
        }
        catch (e)
        {};
        return 'None';
};
FCKSelection.GetSelectedElement = function ()
{
        if (this.GetType() == 'Control')
        {
                var A = this.GetSelection().createRange();
                if (A && A.item) return this.GetSelection().createRange().item(0);
        };
        return null;
};
FCKSelection.GetParentElement = function ()
{
        switch (this.GetType())
        {
        case 'Control':
                var A = FCKSelection.GetSelectedElement();
                return A ? A.parentElement : null;
        case 'None':
                return null;
        default:
                return this.GetSelection().createRange().parentElement();
        }
};
FCKSelection.GetBoundaryParentElement = function (A)
{
        switch (this.GetType())
        {
        case 'Control':
                var B = FCKSelection.GetSelectedElement();
                return B ? B.parentElement : null;
        case 'None':
                return null;
        default:
                var C = FCK.EditorDocument;
                var D = C.selection.createRange();
                D.collapse(A !== false);
                var B = D.parentElement();
                return FCKTools.GetElementDocument(B) == C ? B : null;
        }
};
FCKSelection.SelectNode = function (A)
{
        FCK.Focus();
        this.GetSelection().empty();
        var B;
        try
        {
                B = FCK.EditorDocument.body.createControlRange();
                B.addElement(A);
                B.select();
        }
        catch (e)
        {
                B = FCK.EditorDocument.body.createTextRange();
                B.moveToElementText(A);
                B.select();
        }
};
FCKSelection.Collapse = function (A)
{
        FCK.Focus();
        if (this.GetType() == 'Text')
        {
                var B = this.GetSelection().createRange();
                B.collapse(A == null || A === true);
                B.select();
        }
};
FCKSelection.HasAncestorNode = function (A)
{
        var B;
        if (this.GetSelection().type == "Control")
        {
                B = this.GetSelectedElement();
        }
        else
        {
                var C = this.GetSelection().createRange();
                B = C.parentElement();
        }
        while (B)
        {
                if (B.nodeName.IEquals(A)) return true;
                B = B.parentNode;
        };
        return false;
};
FCKSelection.MoveToAncestorNode = function (A)
{
        var B, oRange;
        if (!FCK.EditorDocument) return null;
        if (this.GetSelection().type == "Control")
        {
                oRange = this.GetSelection().createRange();
                for (i = 0; i < oRange.length; i++)
                {
                        if (oRange(i).parentNode)
                        {
                                B = oRange(i).parentNode;
                                break;
                        }
                }
        }
        else
        {
                oRange = this.GetSelection().createRange();
                B = oRange.parentElement();
        }
        while (B && !B.nodeName.Equals(A)) B = B.parentNode;
        return B;
};
FCKSelection.Delete = function ()
{
        var A = this.GetSelection();
        if (A.type.toLowerCase() != "none")
        {
                A.clear();
        };
        return A;
};
FCKSelection.GetSelection = function ()
{
        this.Restore();
        return FCK.EditorDocument.selection;
};
FCKSelection.Save = function (A)
{
        var B = FCK.EditorDocument;
        if (!B) return;
        if (this.locked) return;
        this.locked = !! A;
        var C = B.selection;
        var D;
        if (C)
        {
                try
                {
                        D = C.createRange();
                }
                catch (e)
                {};
                if (D)
                {
                        if (D.parentElement && FCKTools.GetElementDocument(D.parentElement()) != B) D = null;
                        else if (D.item && FCKTools.GetElementDocument(D.item(0)) != B) D = null;
                }
        };
        this.SelectionData = D;
};
FCKSelection._GetSelectionDocument = function (A)
{
        var B = A.createRange();
        if (!B) return null;
        else if (B.item) return FCKTools.GetElementDocument(B.item(0));
        else return FCKTools.GetElementDocument(B.parentElement());
};
FCKSelection.Restore = function ()
{
        if (this.SelectionData)
        {
                FCK.IsSelectionChangeLocked = true;
                try
                {
                        if (String(this._GetSelectionDocument(FCK.EditorDocument.selection).body.contentEditable) == 'true')
                        {
                                FCK.IsSelectionChangeLocked = false;
                                return;
                        };
                        this.SelectionData.select();
                }
                catch (e)
                {};
                FCK.IsSelectionChangeLocked = false;
        }
};
FCKSelection.Release = function ()
{
        this.locked = false;
        delete this.SelectionData;
};
var FCKTableHandler = {};
FCKTableHandler.InsertRow = function (A)
{
        var B = FCKSelection.MoveToAncestorNode('TR');
        if (!B) return;
        var C = B.cloneNode(true);
        B.parentNode.insertBefore(C, B);
        FCKTableHandler.ClearRow(A ? C : B);
};
FCKTableHandler.DeleteRows = function (A)
{
        if (!A)
        {
                var B = FCKTableHandler.GetSelectedCells();
                var C = [];
                for (var i = 0; i < B.length; i++)
                {
                        var D = B[i].parentNode;
                        C[D.rowIndex] = D;
                };
                for (var i = C.length; i >= 0; i--)
                {
                        if (C[i]) FCKTableHandler.DeleteRows(C[i]);
                };
                return;
        };
        var E = FCKTools.GetElementAscensor(A, 'TABLE');
        if (E.rows.length == 1)
        {
                FCKTableHandler.DeleteTable(E);
                return;
        };
        A.parentNode.removeChild(A);
};
FCKTableHandler.DeleteTable = function (A)
{
        if (!A)
        {
                A = FCKSelection.GetSelectedElement();
                if (!A || A.tagName != 'TABLE') A = FCKSelection.MoveToAncestorNode('TABLE');
        };
        if (!A) return;
        FCKSelection.SelectNode(A);
        FCKSelection.Collapse();
        if (A.parentNode.childNodes.length == 1) A.parentNode.parentNode.removeChild(A.parentNode);
        else A.parentNode.removeChild(A);
};
FCKTableHandler.InsertColumn = function (A)
{
        var B = null;
        var C = this.GetSelectedCells();
        if (C && C.length) B = C[A ? 0 : (C.length - 1)];
        if (!B) return;
        var D = FCKTools.GetElementAscensor(B, 'TABLE');
        var E = B.cellIndex;
        for (var i = 0; i < D.rows.length; i++)
        {
                var F = D.rows[i];
                if (F.cells.length < (E + 1)) continue;
                B = F.cells[E].cloneNode(false);
                if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(B);
                var G = F.cells[E];
                F.insertBefore(B, (A ? G : G.nextSibling));
        }
};
FCKTableHandler.DeleteColumns = function (A)
{
        if (!A)
        {
                var B = FCKTableHandler.GetSelectedCells();
                for (var i = B.length; i >= 0; i--)
                {
                        if (B[i]) FCKTableHandler.DeleteColumns(B[i]);
                };
                return;
        };
        if (!A) return;
        var C = FCKTools.GetElementAscensor(A, 'TABLE');
        var D = A.cellIndex;
        for (var i = C.rows.length - 1; i >= 0; i--)
        {
                var E = C.rows[i];
                if (D == 0 && E.cells.length == 1)
                {
                        FCKTableHandler.DeleteRows(E);
                        continue;
                };
                if (E.cells[D]) E.removeChild(E.cells[D]);
        }
};
FCKTableHandler.InsertCell = function (A, B)
{
        var C = null;
        var D = this.GetSelectedCells();
        if (D && D.length) C = D[B ? 0 : (D.length - 1)];
        if (!C) return null;
        var E = FCK.EditorDocument.createElement('TD');
        if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(E);
        if (!B && C.cellIndex == C.parentNode.cells.length - 1) C.parentNode.appendChild(E);
        else C.parentNode.insertBefore(E, B ? C : C.nextSibling);
        return E;
};
FCKTableHandler.DeleteCell = function (A)
{
        if (A.parentNode.cells.length == 1)
        {
                FCKTableHandler.DeleteRows(A.parentNode);
                return;
        };
        A.parentNode.removeChild(A);
};
FCKTableHandler.DeleteCells = function ()
{
        var A = FCKTableHandler.GetSelectedCells();
        for (var i = A.length - 1; i >= 0; i--)
        {
                FCKTableHandler.DeleteCell(A[i]);
        }
};
FCKTableHandler._MarkCells = function (A, B)
{
        for (var i = 0; i < A.length; i++) A[i][B] = true;
};
FCKTableHandler._UnmarkCells = function (A, B)
{
        for (var i = 0; i < A.length; i++)
        {
                FCKDomTools.ClearElementJSProperty(A[i], B);
        }
};
FCKTableHandler._ReplaceCellsByMarker = function (A, B, C)
{
        for (var i = 0; i < A.length; i++)
        {
                for (var j = 0; j < A[i].length; j++)
                {
                        if (A[i][j][B]) A[i][j] = C;
                }
        }
};
FCKTableHandler._GetMarkerGeometry = function (A, B, C, D)
{
        var E = 0;
        var F = 0;
        var G = 0;
        var H = 0;
        for (var i = C; A[B][i] && A[B][i][D]; i++) E++;
        for (var i = C - 1; A[B][i] && A[B][i][D]; i--)
        {
                E++;
                G++;
        };
        for (var i = B; A[i] && A[i][C] && A[i][C][D]; i++) F++;
        for (var i = B - 1; A[i] && A[i][C] && A[i][C][D]; i--)
        {
                F++;
                H++;
        };
        return {
                'width': E,
                'height': F,
                'x': G,
                'y': H
        };
};
FCKTableHandler.CheckIsSelectionRectangular = function ()
{
        var A = FCKTableHandler.GetSelectedCells();
        if (A.length < 1) return false;
        for (var i = 0; i < A.length; i++)
        {
                if (A[i].parentNode.parentNode != A[0].parentNode.parentNode) return false;
        };
        this._MarkCells(A, '_CellSelected');
        var B = this._CreateTableMap(A[0]);
        var C = A[0].parentNode.rowIndex;
        var D = this._GetCellIndexSpan(B, C, A[0]);
        var E = this._GetMarkerGeometry(B, C, D, '_CellSelected');
        var F = D - E.x;
        var G = C - E.y;
        if (E.width >= E.height)
        {
                for (D = F; D < F + E.width; D++)
                {
                        C = G + (D - F) % E.height;
                        if (!B[C] || !B[C][D])
                        {
                                this._UnmarkCells(A, '_CellSelected');
                                return false;
                        };
                        var g = this._GetMarkerGeometry(B, C, D, '_CellSelected');
                        if (g.width != E.width || g.height != E.height)
                        {
                                this._UnmarkCells(A, '_CellSelected');
                                return false;
                        }
                }
        }
        else
        {
                for (C = G; C < G + E.height; C++)
                {
                        D = F + (C - G) % E.width;
                        if (!B[C] || !B[C][D])
                        {
                                this._UnmarkCells(A, '_CellSelected');
                                return false;
                        };
                        var g = this._GetMarkerGeometry(B, C, D, '_CellSelected');
                        if (g.width != E.width || g.height != E.height)
                        {
                                this._UnmarkCells(A, '_CellSelected');
                                return false;
                        }
                }
        };
        this._UnmarkCells(A, '_CellSelected');
        return true;
};
FCKTableHandler.MergeCells = function ()
{
        var A = this.GetSelectedCells();
        if (A.length < 2) return;
        var B = A[0];
        var C = this._CreateTableMap(B);
        var D = B.parentNode.rowIndex;
        var E = this._GetCellIndexSpan(C, D, B);
        this._MarkCells(A, '_SelectedCells');
        var F = this._GetMarkerGeometry(C, D, E, '_SelectedCells');
        var G = E - F.x;
        var H = D - F.y;
        var I = FCKTools.GetElementDocument(B).createDocumentFragment();
        for (var i = 0; i < F.height; i++)
        {
                var J = 0;
                for (var j = 0; j < F.width; j++)
                {
                        var K = C[H + i][G + j];
                        while (K.childNodes.length > 0)
                        {
                                var L = K.removeChild(K.firstChild);
                                if (L.nodeType != 1 || (L.getAttribute('type', 2) != '_moz' && L.getAttribute('_moz_dirty') != null))
                                {
                                        I.appendChild(L);
                                        J++;
                                }
                        }
                };
                if (J > 0) I.appendChild(FCK.EditorDocument.createElement('br'));
        };
        this._ReplaceCellsByMarker(C, '_SelectedCells', B);
        this._UnmarkCells(A, '_SelectedCells');
        this._InstallTableMap(C, B.parentNode.parentNode.parentNode);
        B.appendChild(I);
        if (FCKBrowserInfo.IsGeckoLike && (!B.firstChild)) FCKTools.AppendBogusBr(B);
        this._MoveCaretToCell(B, false);
};
FCKTableHandler.MergeRight = function ()
{
        var A = this.GetMergeRightTarget();
        if (A == null) return;
        var B = A.refCell;
        var C = A.tableMap;
        var D = A.nextCell;
        var E = FCK.EditorDocument.createDocumentFragment();
        while (D && D.childNodes && D.childNodes.length > 0) E.appendChild(D.removeChild(D.firstChild));
        D.parentNode.removeChild(D);
        B.appendChild(E);
        this._MarkCells([D], '_Replace');
        this._ReplaceCellsByMarker(C, '_Replace', B);
        this._InstallTableMap(C, B.parentNode.parentNode.parentNode);
        this._MoveCaretToCell(B, false);
};
FCKTableHandler.MergeDown = function ()
{
        var A = this.GetMergeDownTarget();
        if (A == null) return;
        var B = A.refCell;
        var C = A.tableMap;
        var D = A.nextCell;
        var E = FCKTools.GetElementDocument(B).createDocumentFragment();
        while (D && D.childNodes && D.childNodes.length > 0) E.appendChild(D.removeChild(D.firstChild));
        if (E.firstChild) E.insertBefore(FCK.EditorDocument.createElement('br'), E.firstChild);
        B.appendChild(E);
        this._MarkCells([D], '_Replace');
        this._ReplaceCellsByMarker(C, '_Replace', B);
        this._InstallTableMap(C, B.parentNode.parentNode.parentNode);
        this._MoveCaretToCell(B, false);
};
FCKTableHandler.HorizontalSplitCell = function ()
{
        var A = FCKTableHandler.GetSelectedCells();
        if (A.length != 1) return;
        var B = A[0];
        var C = this._CreateTableMap(B);
        var D = B.parentNode.rowIndex;
        var E = FCKTableHandler._GetCellIndexSpan(C, D, B);
        var F = isNaN(B.colSpan) ? 1 : B.colSpan;
        if (F > 1)
        {
                var G = Math.ceil(F / 2);
                var H = FCK.EditorDocument.createElement(B.nodeName);
                if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(H);
                var I = E + G;
                var J = E + F;
                var K = isNaN(B.rowSpan) ? 1 : B.rowSpan;
                for (var r = D; r < D + K; r++)
                {
                        for (var i = I; i < J; i++) C[r][i] = H;
                }
        }
        else
        {
                var L = [];
                for (var i = 0; i < C.length; i++)
                {
                        var M = C[i].slice(0, E);
                        if (C[i].length <= E)
                        {
                                L.push(M);
                                continue;
                        };
                        if (C[i][E] == B)
                        {
                                M.push(B);
                                M.push(FCK.EditorDocument.createElement(B.nodeName));
                                if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(M[M.length - 1]);
                        }
                        else
                        {
                                M.push(C[i][E]);
                                M.push(C[i][E]);
                        };
                        for (var j = E + 1; j < C[i].length; j++) M.push(C[i][j]);
                        L.push(M);
                };
                C = L;
        };
        this._InstallTableMap(C, B.parentNode.parentNode.parentNode);
};
FCKTableHandler.VerticalSplitCell = function ()
{
        var A = FCKTableHandler.GetSelectedCells();
        if (A.length != 1) return;
        var B = A[0];
        var C = this._CreateTableMap(B);
        var D = B.parentNode.rowIndex;
        var E = FCKTableHandler._GetCellIndexSpan(C, D, B);
        var F = isNaN(B.colSpan) ? 1 : B.colSpan;
        var G = B.rowSpan;
        if (isNaN(G)) G = 1;
        if (G > 1)
        {
                B.rowSpan = Math.ceil(G / 2);
                var H = D + Math.ceil(G / 2);
                var I = C[H];
                var J = null;
                for (var i = E + 1; i < I.length; i++)
                {
                        if (I[i].parentNode.rowIndex == H)
                        {
                                J = I[i];
                                break;
                        }
                };
                var K = FCK.EditorDocument.createElement(B.nodeName);
                K.rowSpan = Math.floor(G / 2);
                if (F > 1) K.colSpan = F;
                if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(K);
                B.parentNode.parentNode.parentNode.rows[H].insertBefore(K, J);
        }
        else
        {
                var L = B.parentNode.sectionRowIndex + 1;
                var M = FCK.EditorDocument.createElement('tr');
                var N = B.parentNode.parentNode;
                if (N.rows.length > L) N.insertBefore(M, N.rows[L]);
                else N.appendChild(M);
                for (var i = 0; i < C[D].length;)
                {
                        var O = C[D][i].colSpan;
                        if (isNaN(O) || O < 1) O = 1;
                        if (i == E)
                        {
                                i += O;
                                continue;
                        };
                        var P = C[D][i].rowSpan;
                        if (isNaN(P)) P = 1;
                        C[D][i].rowSpan = P + 1;
                        i += O;
                };
                var K = FCK.EditorDocument.createElement(B.nodeName);
                if (F > 1) K.colSpan = F;
                if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(K);
                M.appendChild(K);
        }
};
FCKTableHandler._GetCellIndexSpan = function (A, B, C)
{
        if (A.length < B + 1) return null;
        var D = A[B];
        for (var c = 0; c < D.length; c++)
        {
                if (D[c] == C) return c;
        };
        return null;
};
FCKTableHandler._GetCellLocation = function (A, B)
{
        for (var i = 0; i < A.length; i++)
        {
                for (var c = 0; c < A[i].length; c++)
                {
                        if (A[i][c] == B) return [i, c];
                }
        };
        return null;
};
FCKTableHandler._CreateTableMap = function (A)
{
        var B = (A.nodeName == 'TABLE' ? A : A.parentNode.parentNode.parentNode);
        var C = B.rows;
        var r = -1;
        var D = [];
        for (var i = 0; i < C.length; i++)
        {
                r++;
                if (!D[r]) D[r] = [];
                var c = -1;
                for (var j = 0; j < C[i].cells.length; j++)
                {
                        var E = C[i].cells[j];
                        c++;
                        while (D[r][c]) c++;
                        var F = isNaN(E.colSpan) ? 1 : E.colSpan;
                        var G = isNaN(E.rowSpan) ? 1 : E.rowSpan;
                        for (var H = 0; H < G; H++)
                        {
                                if (!D[r + H]) D[r + H] = [];
                                for (var I = 0; I < F; I++)
                                {
                                        D[r + H][c + I] = C[i].cells[j];
                                }
                        };
                        c += F - 1;
                }
        };
        return D;
};
FCKTableHandler._InstallTableMap = function (A, B)
{
        var C = FCKBrowserInfo.IsIE ? "_fckrowspan" : "rowSpan";
        for (var i = 0; i < A.length; i++)
        {
                for (var j = 0; j < A[i].length; j++)
                {
                        var D = A[i][j];
                        if (D.parentNode) D.parentNode.removeChild(D);
                        D.colSpan = D[C] = 1;
                }
        };
        var E = 0;
        for (var i = 0; i < A.length; i++)
        {
                for (var j = 0; j < A[i].length; j++)
                {
                        var D = A[i][j];
                        if (!D) continue;
                        if (j > E) E = j;
                        if (D._colScanned === true) continue;
                        if (A[i][j - 1] == D) D.colSpan++;
                        if (A[i][j + 1] != D) D._colScanned = true;
                }
        };
        for (var i = 0; i <= E; i++)
        {
                for (var j = 0; j < A.length; j++)
                {
                        if (!A[j]) continue;
                        var D = A[j][i];
                        if (!D || D._rowScanned === true) continue;
                        if (A[j - 1] && A[j - 1][i] == D) D[C]++;
                        if (!A[j + 1] || A[j + 1][i] != D) D._rowScanned = true;
                }
        };
        for (var i = 0; i < A.length; i++)
        {
                for (var j = 0; j < A[i].length; j++)
                {
                        var D = A[i][j];
                        FCKDomTools.ClearElementJSProperty(D, '_colScanned');
                        FCKDomTools.ClearElementJSProperty(D, '_rowScanned');
                }
        };
        for (var i = 0; i < A.length; i++)
        {
                var I = FCK.EditorDocument.createElement('tr');
                for (var j = 0; j < A[i].length;)
                {
                        var D = A[i][j];
                        if (A[i - 1] && A[i - 1][j] == D)
                        {
                                j += D.colSpan;
                                continue;
                        };
                        I.appendChild(D);
                        if (C != 'rowSpan')
                        {
                                D.rowSpan = D[C];
                                D.removeAttribute(C);
                        };
                        j += D.colSpan;
                        if (D.colSpan == 1) D.removeAttribute('colspan');
                        if (D.rowSpan == 1) D.removeAttribute('rowspan');
                };
                if (FCKBrowserInfo.IsIE)
                {
                        B.rows[i].replaceNode(I);
                }
                else
                {
                        B.rows[i].innerHTML = '';
                        FCKDomTools.MoveChildren(I, B.rows[i]);
                }
        }
};
FCKTableHandler._MoveCaretToCell = function (A, B)
{
        var C = new FCKDomRange(FCK.EditorWindow);
        C.MoveToNodeContents(A);
        C.Collapse(B);
        C.Select();
};
FCKTableHandler.ClearRow = function (A)
{
        var B = A.cells;
        for (var i = 0; i < B.length; i++)
        {
                B[i].innerHTML = '';
                if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(B[i]);
        }
};
FCKTableHandler.GetMergeRightTarget = function ()
{
        var A = this.GetSelectedCells();
        if (A.length != 1) return null;
        var B = A[0];
        var C = this._CreateTableMap(B);
        var D = B.parentNode.rowIndex;
        var E = this._GetCellIndexSpan(C, D, B);
        var F = E + (isNaN(B.colSpan) ? 1 : B.colSpan);
        var G = C[D][F];
        if (!G) return null;
        this._MarkCells([B, G], '_SizeTest');
        var H = this._GetMarkerGeometry(C, D, E, '_SizeTest');
        var I = this._GetMarkerGeometry(C, D, F, '_SizeTest');
        this._UnmarkCells([B, G], '_SizeTest');
        if (H.height != I.height || H.y != I.y) return null;
        return {
                'refCell': B,
                'nextCell': G,
                'tableMap': C
        };
};
FCKTableHandler.GetMergeDownTarget = function ()
{
        var A = this.GetSelectedCells();
        if (A.length != 1) return null;
        var B = A[0];
        var C = this._CreateTableMap(B);
        var D = B.parentNode.rowIndex;
        var E = this._GetCellIndexSpan(C, D, B);
        var F = D + (isNaN(B.rowSpan) ? 1 : B.rowSpan);
        if (!C[F]) return null;
        var G = C[F][E];
        if (!G) return null;
        if (B.parentNode.parentNode != G.parentNode.parentNode) return null;
        this._MarkCells([B, G], '_SizeTest');
        var H = this._GetMarkerGeometry(C, D, E, '_SizeTest');
        var I = this._GetMarkerGeometry(C, F, E, '_SizeTest');
        this._UnmarkCells([B, G], '_SizeTest');
        if (H.width != I.width || H.x != I.x) return null;
        return {
                'refCell': B,
                'nextCell': G,
                'tableMap': C
        };
};
FCKTableHandler.GetSelectedCells = function ()
{
        if (FCKSelection.GetType() == 'Control')
        {
                var A = FCKSelection.MoveToAncestorNode(['TD', 'TH']);
                return A ? [A] : [];
        };
        var B = [];
        var C = FCKSelection.GetSelection().createRange();
        var D = FCKSelection.GetParentElement();
        if (D && D.tagName.Equals('TD', 'TH')) B[0] = D;
        else
        {
                D = FCKSelection.MoveToAncestorNode('TABLE');
                if (D)
                {
                        for (var i = 0; i < D.cells.length; i++)
                        {
                                var E = FCK.EditorDocument.body.createTextRange();
                                E.moveToElementText(D.cells[i]);
                                if (C.inRange(E) || (C.compareEndPoints('StartToStart', E) >= 0 && C.compareEndPoints('StartToEnd', E) <= 0) || (C.compareEndPoints('EndToStart', E) >= 0 && C.compareEndPoints('EndToEnd', E) <= 0))
                                {
                                        B[B.length] = D.cells[i];
                                }
                        }
                }
        };
        return B;
};
var FCKXml = function ()
        {
                this.Error = false;
        };
FCKXml.GetAttribute = function (A, B, C)
{
        var D = A.attributes.getNamedItem(B);
        return D ? D.value : C;
};
FCKXml.TransformToObject = function (A)
{
        if (!A) return null;
        var B = {};
        var C = A.attributes;
        for (var i = 0; i < C.length; i++)
        {
                var D = C[i];
                B[D.name] = D.value;
        };
        var E = A.childNodes;
        for (i = 0; i < E.length; i++)
        {
                var F = E[i];
                if (F.nodeType == 1)
                {
                        var G = '$' + F.nodeName;
                        var H = B[G];
                        if (!H) H = B[G] = [];
                        H.push(this.TransformToObject(F));
                }
        };
        return B;
};
FCKXml.prototype = {
        LoadUrl: function (A)
        {
                this.Error = false;
                var B = FCKTools.CreateXmlObject('XmlHttp');
                if (!B)
                {
                        this.Error = true;
                        return;
                };
                B.open("GET", A, false);
                B.send(null);
                if (B.status == 200 || B.status == 304 || (B.status == 0 && B.readyState == 4))
                {
                        this.DOMDocument = B.responseXML;
                        if (!this.DOMDocument || this.DOMDocument.firstChild == null)
                        {
                                this.DOMDocument = FCKTools.CreateXmlObject('DOMDocument');
                                this.DOMDocument.async = false;
                                this.DOMDocument.resolveExternals = false;
                                this.DOMDocument.loadXML(B.responseText);
                        }
                }
                else
                {
                        this.DOMDocument = null;
                };
                if (this.DOMDocument == null || this.DOMDocument.firstChild == null)
                {
                        this.Error = true;
                        if (window.confirm('Error loading "' + A + '"\r\nDo you want to see more info?')) alert('URL requested: "' + A + '"\r\nServer response:\r\nStatus: ' + B.status + '\r\nResponse text:\r\n' + B.responseText);
                }
        },
        SelectNodes: function (A, B)
        {
                if (this.Error) return [];
                if (B) return B.selectNodes(A);
                else return this.DOMDocument.selectNodes(A);
        },
        SelectSingleNode: function (A, B)
        {
                if (this.Error) return null;
                if (B) return B.selectSingleNode(A);
                else return this.DOMDocument.selectSingleNode(A);
        }
};
var FCKNamedCommand = function (A)
        {
                this.Name = A;
        };
FCKNamedCommand.prototype.Execute = function ()
{
        FCK.ExecuteNamedCommand(this.Name);
};
FCKNamedCommand.prototype.GetState = function ()
{
        if (FCK.EditMode != 0) return -1;
        return FCK.GetNamedCommandState(this.Name);
};
var FCKStyleCommand = function ()
        {};
FCKStyleCommand.prototype = {
        Name: 'Style',
        Execute: function (A, B)
        {
                FCKUndo.SaveUndoStep();
                if (B.Selected) FCK.Styles.RemoveStyle(B.Style);
                else FCK.Styles.ApplyStyle(B.Style);
                FCKUndo.SaveUndoStep();
                FCK.Focus();
                FCK.Events.FireEvent('OnSelectionChange');
        },
        GetState: function ()
        {
                if (FCK.EditMode != 0 || !FCK.EditorDocument) return -1;
                if (FCKSelection.GetType() == 'Control')
                {
                        var A = FCKSelection.GetSelectedElement();
                        if (!A || !FCKStyles.CheckHasObjectStyle(A.nodeName.toLowerCase())) return -1;
                };
                return 0;
        }
};
var FCKDialogCommand = function (A, B, C, D, E, F, G, H)
        {
                this.Name = A;
                this.Title = B;
                this.Url = C;
                this.Width = D;
                this.Height = E;
                this.CustomValue = H;
                this.GetStateFunction = F;
                this.GetStateParam = G;
                this.Resizable = false;
        };
FCKDialogCommand.prototype.Execute = function ()
{
        FCKDialog.OpenDialog('FCKDialog_' + this.Name, this.Title, this.Url, this.Width, this.Height, this.CustomValue, this.Resizable);
};
FCKDialogCommand.prototype.GetState = function ()
{
        if (this.GetStateFunction) return this.GetStateFunction(this.GetStateParam);
        else return FCK.EditMode == 0 ? 0 : -1;
};
var FCKUndefinedCommand = function ()
        {
                this.Name = 'Undefined';
        };
FCKUndefinedCommand.prototype.Execute = function ()
{
        alert(FCKLang.NotImplemented);
};
FCKUndefinedCommand.prototype.GetState = function ()
{
        return 0;
};
var FCKFormatBlockCommand = function ()
        {};
FCKFormatBlockCommand.prototype = {
        Name: 'FormatBlock',
        Execute: FCKStyleCommand.prototype.Execute,
        GetState: function ()
        {
                return FCK.EditorDocument ? 0 : -1;
        }
};
var FCKFontNameCommand = function ()
        {};
FCKFontNameCommand.prototype = {
        Name: 'FontName',
        Execute: FCKStyleCommand.prototype.Execute,
        GetState: FCKFormatBlockCommand.prototype.GetState
};
var FCKFontSizeCommand = function ()
        {};
FCKFontSizeCommand.prototype = {
        Name: 'FontSize',
        Execute: FCKStyleCommand.prototype.Execute,
        GetState: FCKFormatBlockCommand.prototype.GetState
};
var FCKPreviewCommand = function ()
        {
                this.Name = 'Preview';
        };
FCKPreviewCommand.prototype.Execute = function ()
{
        FCK.Preview();
};
FCKPreviewCommand.prototype.GetState = function ()
{
        return 0;
};
var FCKSaveCommand = function ()
        {
                this.Name = 'Save';
        };
FCKSaveCommand.prototype.Execute = function ()
{
        var A = FCK.GetParentForm();
        if (typeof (A.onsubmit) == 'function')
        {
                var B = A.onsubmit();
                if (B != null && B === false) return;
        };
        if (typeof (A.submit) == 'function') A.submit();
        else A.submit.click();
};
FCKSaveCommand.prototype.GetState = function ()
{
        return 0;
};
var FCKNewPageCommand = function ()
        {
                this.Name = 'NewPage';
        };
FCKNewPageCommand.prototype.Execute = function ()
{
        FCKUndo.SaveUndoStep();
        FCK.SetData('');
        FCKUndo.Typing = true;
        FCK.Focus();
};
FCKNewPageCommand.prototype.GetState = function ()
{
        return 0;
};
var FCKSourceCommand = function ()
        {
                this.Name = 'Source';
        };
FCKSourceCommand.prototype.Execute = function ()
{
        if (FCKConfig.SourcePopup)
        {
                var A = FCKConfig.ScreenWidth * 0.65;
                var B = FCKConfig.ScreenHeight * 0.65;
                FCKDialog.OpenDialog('FCKDialog_Source', FCKLang.Source, 'dialog/fck_source.html', A, B, null, true);
        }
        else FCK.SwitchEditMode();
};
FCKSourceCommand.prototype.GetState = function ()
{
        return (FCK.EditMode == 0 ? 0 : 1);
};
var FCKUndoCommand = function ()
        {
                this.Name = 'Undo';
        };
FCKUndoCommand.prototype.Execute = function ()
{
        FCKUndo.Undo();
};
FCKUndoCommand.prototype.GetState = function ()
{
        if (FCK.EditMode != 0) return -1;
        return (FCKUndo.CheckUndoState() ? 0 : -1);
};
var FCKRedoCommand = function ()
        {
                this.Name = 'Redo';
        };
FCKRedoCommand.prototype.Execute = function ()
{
        FCKUndo.Redo();
};
FCKRedoCommand.prototype.GetState = function ()
{
        if (FCK.EditMode != 0) return -1;
        return (FCKUndo.CheckRedoState() ? 0 : -1);
};
var FCKPageBreakCommand = function ()
        {
                this.Name = 'PageBreak';
        };
FCKPageBreakCommand.prototype.Execute = function ()
{
        FCKUndo.SaveUndoStep();
        var e = FCK.EditorDocument.createElement('DIV');
        e.style.pageBreakAfter = 'always';
        e.innerHTML = '<span style="DISPLAY:none">&nbsp;</span>';
        var A = FCKDocumentProcessor_CreateFakeImage('FCK__PageBreak', e);
        var B = new FCKDomRange(FCK.EditorWindow);
        B.MoveToSelection();
        var C = B.SplitBlock();
        B.InsertNode(A);
        FCK.Events.FireEvent('OnSelectionChange');
};
FCKPageBreakCommand.prototype.GetState = function ()
{
        if (FCK.EditMode != 0) return -1;
        return 0;
};
var FCKUnlinkCommand = function ()
        {
                this.Name = 'Unlink';
        };
FCKUnlinkCommand.prototype.Execute = function ()
{
        FCKUndo.SaveUndoStep();
        if (FCKBrowserInfo.IsGeckoLike)
        {
                var A = FCK.Selection.MoveToAncestorNode('A');
                if (A) FCKTools.RemoveOuterTags(A);
                return;
        };
        FCK.ExecuteNamedCommand(this.Name);
};
FCKUnlinkCommand.prototype.GetState = function ()
{
        if (FCK.EditMode != 0) return -1;
        var A = FCK.GetNamedCommandState(this.Name);
        if (A == 0 && FCK.EditMode == 0)
        {
                var B = FCKSelection.MoveToAncestorNode('A');
                var C = (B && B.name.length > 0 && B.href.length == 0);
                if (C) A = -1;
        };
        return A;
};
var FCKVisitLinkCommand = function ()
        {
                this.Name = 'VisitLink';
        };
FCKVisitLinkCommand.prototype = {
        GetState: function ()
        {
                if (FCK.EditMode != 0) return -1;
                var A = FCK.GetNamedCommandState('Unlink');
                if (A == 0)
                {
                        var B = FCKSelection.MoveToAncestorNode('A');
                        if (!B.href) A = -1;
                };
                return A;
        },
        Execute: function ()
        {
                var A = FCKSelection.MoveToAncestorNode('A');
                var B = A.getAttribute('_fcksavedurl') || A.getAttribute('href', 2);
                if (!/:\/\//.test(B))
                {
                        var C = FCKConfig.BaseHref;
                        var D = FCK.GetInstanceObject('parent');
                        if (!C)
                        {
                                C = D.document.location.href;
                                C = C.substring(0, C.lastIndexOf('/') + 1);
                        };
                        if (/^\//.test(B))
                        {
                                try
                                {
                                        C = C.match(/^.*:\/\/+[^\/]+/)[0];
                                }
                                catch (e)
                                {
                                        C = D.document.location.protocol + '://' + D.parent.document.location.host;
                                }
                        };
                        B = C + B;
                };
                if (!window.open(B, '_blank')) alert(FCKLang.VisitLinkBlocked);
        }
};
var FCKSelectAllCommand = function ()
        {
                this.Name = 'SelectAll';
        };
FCKSelectAllCommand.prototype.Execute = function ()
{
        if (FCK.EditMode == 0)
        {
                FCK.ExecuteNamedCommand('SelectAll');
        }
        else
        {
                var A = FCK.EditingArea.Textarea;
                if (FCKBrowserInfo.IsIE)
                {
                        A.createTextRange().execCommand('SelectAll');
                }
                else
                {
                        A.selectionStart = 0;
                        A.selectionEnd = A.value.length;
                };
                A.focus();
        }
};
FCKSelectAllCommand.prototype.GetState = function ()
{
        if (FCK.EditMode != 0) return -1;
        return 0;
};
var FCKPasteCommand = function ()
        {
                this.Name = 'Paste';
        };
FCKPasteCommand.prototype = {
        Execute: function ()
        {
                if (FCKBrowserInfo.IsIE) FCK.Paste();
                else FCK.ExecuteNamedCommand('Paste');
        },
        GetState: function ()
        {
                if (FCK.EditMode != 0) return -1;
                return FCK.GetNamedCommandState('Paste');
        }
};
var FCKRuleCommand = function ()
        {
                this.Name = 'Rule';
        };
FCKRuleCommand.prototype = {
        Execute: function ()
        {
                FCKUndo.SaveUndoStep();
                FCK.InsertElement('hr');
        },
        GetState: function ()
        {
                if (FCK.EditMode != 0) return -1;
                return FCK.GetNamedCommandState('InsertHorizontalRule');
        }
};
var FCKCutCopyCommand = function (A)
        {
                this.Name = A ? 'Cut' : 'Copy';
        };
FCKCutCopyCommand.prototype = {
        Execute: function ()
        {
                var A = false;
                if (FCKBrowserInfo.IsIE)
                {
                        var B = function ()
                                {
                                        A = true;
                                };
                        var C = 'on' + this.Name.toLowerCase();
                        FCK.EditorDocument.body.attachEvent(C, B);
                        FCK.ExecuteNamedCommand(this.Name);
                        FCK.EditorDocument.body.detachEvent(C, B);
                }
                else
                {
                        try
                        {
                                FCK.ExecuteNamedCommand(this.Name);
                                A = true;
                        }
                        catch (e)
                        {}
                };
                if (!A) alert(FCKLang['PasteError' + this.Name]);
        },
        GetState: function ()
        {
                return FCK.EditMode != 0 ? -1 : FCK.GetNamedCommandState('Cut');
        }
};
var FCKAnchorDeleteCommand = function ()
        {
                this.Name = 'AnchorDelete';
        };
FCKAnchorDeleteCommand.prototype = {
        Execute: function ()
        {
                if (FCK.Selection.GetType() == 'Control')
                {
                        FCK.Selection.Delete();
                }
                else
                {
                        var A = FCK.Selection.GetSelectedElement();
                        if (A)
                        {
                                if (A.tagName == 'IMG' && A.getAttribute('_fckanchor')) oAnchor = FCK.GetRealElement(A);
                                else A = null;
                        };
                        if (!A)
                        {
                                oAnchor = FCK.Selection.MoveToAncestorNode('A');
                                if (oAnchor) FCK.Selection.SelectNode(oAnchor);
                        };
                        if (oAnchor.href.length != 0)
                        {
                                oAnchor.removeAttribute('name');
                                if (FCKBrowserInfo.IsIE) oAnchor.className = oAnchor.className.replace(FCKRegexLib.FCK_Class, '');
                                return;
                        };
                        if (A)
                        {
                                A.parentNode.removeChild(A);
                                return;
                        };
                        if (oAnchor.innerHTML.length == 0)
                        {
                                oAnchor.parentNode.removeChild(oAnchor);
                                return;
                        };
                        FCKTools.RemoveOuterTags(oAnchor);
                };
                if (FCKBrowserInfo.IsGecko) FCK.Selection.Collapse(true);
        },
        GetState: function ()
        {
                if (FCK.EditMode != 0) return -1;
                return FCK.GetNamedCommandState('Unlink');
        }
};
var FCKDeleteDivCommand = function ()
        {};
FCKDeleteDivCommand.prototype = {
        GetState: function ()
        {
                if (FCK.EditMode != 0) return -1;
                var A = FCKSelection.GetParentElement();
                var B = new FCKElementPath(A);
                return B.BlockLimit && B.BlockLimit.nodeName.IEquals('div') ? 0 : -1;
        },
        Execute: function ()
        {
                FCKUndo.SaveUndoStep();
                var A = FCKDomTools.GetSelectedDivContainers();
                var B = new FCKDomRange(FCK.EditorWindow);
                B.MoveToSelection();
                var C = B.CreateBookmark();
                for (var i = 0; i < A.length; i++) FCKDomTools.RemoveNode(A[i], true);
                B.MoveToBookmark(C);
                B.Select();
        }
};
var FCKNbsp = function ()
        {
                this.Name = 'Non Breaking Space';
        };
FCKNbsp.prototype = {
        Execute: function ()
        {
                FCK.InsertHtml('&nbsp;');
        },
        GetState: function ()
        {
                return (FCK.EditMode != 0 ? -1 : 0);
        }
};
var FCKShowBlockCommand = function (A, B)
        {
                this.Name = A;
                if (B != undefined) this._SavedState = B;
                else this._SavedState = null;
        };
FCKShowBlockCommand.prototype.Execute = function ()
{
        var A = this.GetState();
        if (A == -1) return;
        var B = FCK.EditorDocument.body;
        if (A == 1) B.className = B.className.replace(/(^| )FCK__ShowBlocks/g, '');
        else B.className += ' FCK__ShowBlocks';
        if (FCKBrowserInfo.IsIE)
        {
                try
                {
                        FCK.EditorDocument.selection.createRange().select();
                }
                catch (e)
                {}
        }
        else
        {
                var C = FCK.EditorWindow.getSelection().focusNode;
                if (C)
                {
                        if (C.nodeType != 1) C = C.parentNode;
                        FCKDomTools.ScrollIntoView(C, false);
                }
        };
        FCK.Events.FireEvent('OnSelectionChange');
};
FCKShowBlockCommand.prototype.GetState = function ()
{
        if (FCK.EditMode != 0) return -1;
        if (!FCK.EditorDocument) return 0;
        if (/FCK__ShowBlocks(?:\s|$)/.test(FCK.EditorDocument.body.className)) return 1;
        return 0;
};
FCKShowBlockCommand.prototype.SaveState = function ()
{
        this._SavedState = this.GetState();
};
FCKShowBlockCommand.prototype.RestoreState = function ()
{
        if (this._SavedState != null && this.GetState() != this._SavedState) this.Execute();
};
var FCKSpellCheckCommand = function ()
        {
                this.Name = 'SpellCheck';
                this.IsEnabled = true;
        };
FCKSpellCheckCommand.prototype.Execute = function ()
{
        switch (FCKConfig.SpellChecker)
        {
        case 'ieSpell':
                this._RunIeSpell();
                break;
        case 'SpellerPages':
                FCKDialog.OpenDialog('FCKDialog_SpellCheck', 'Spell Check', 'dialog/fck_spellerpages.html', 440, 480);
                break;
        case 'WSC':
                FCKDialog.OpenDialog('FCKDialog_SpellCheck', 'Spell Check', 'wsc/w.html', 530, 480);
        }
};
FCKSpellCheckCommand.prototype._RunIeSpell = function ()
{
        try
        {
                var A = new ActiveXObject("ieSpell.ieSpellExtension");
                A.CheckAllLinkedDocuments(FCK.EditorDocument);
        }
        catch (e)
        {
                if (e.number == -2146827859)
                {
                        if (confirm(FCKLang.IeSpellDownload)) window.open(FCKConfig.IeSpellDownloadUrl, 'IeSpellDownload');
                }
                else alert('Error Loading ieSpell: ' + e.message + ' (' + e.number + ')');
        }
};
FCKSpellCheckCommand.prototype.GetState = function ()
{
        if (FCK.EditMode != 0) return -1;
        return this.IsEnabled ? 0 : -1;
};
var FCKTextColorCommand = function (A)
        {
                this.Name = A == 'ForeColor' ? 'TextColor' : 'BGColor';
                this.Type = A;
                var B;
                if (FCKBrowserInfo.IsIE) B = window;
                else if (FCK.ToolbarSet._IFrame) B = FCKTools.GetElementWindow(FCK.ToolbarSet._IFrame);
                else B = window.parent;
                this._Panel = new FCKPanel(B);
                this._Panel.AppendStyleSheet(FCKConfig.SkinEditorCSS);
                this._Panel.MainNode.className = 'FCK_Panel';
                this._CreatePanelBody(this._Panel.Document, this._Panel.MainNode);
                FCK.ToolbarSet.ToolbarItems.GetItem(this.Name).RegisterPanel(this._Panel);
                FCKTools.DisableSelection(this._Panel.Document.body);
        };
FCKTextColorCommand.prototype.Execute = function (A, B, C)
{
        this._Panel.Show(A, B, C);
};
FCKTextColorCommand.prototype.SetColor = function (A)
{
        FCKUndo.SaveUndoStep();
        var B = FCKStyles.GetStyle('_FCK_' + (this.Type == 'ForeColor' ? 'Color' : 'BackColor'));
        if (!A || A.length == 0) FCK.Styles.RemoveStyle(B);
        else
        {
                B.SetVariable('Color', A);
                FCKStyles.ApplyStyle(B);
        };
        FCKUndo.SaveUndoStep();
        FCK.Focus();
        FCK.Events.FireEvent('OnSelectionChange');
};
FCKTextColorCommand.prototype.GetState = function ()
{
        if (FCK.EditMode != 0) return -1;
        return 0;
};

function FCKTextColorCommand_OnMouseOver()
{
        this.className = 'ColorSelected';
};

function FCKTextColorCommand_OnMouseOut()
{
        this.className = 'ColorDeselected';
};

function FCKTextColorCommand_OnClick(A, B, C)
{
        this.className = 'ColorDeselected';
        B.SetColor(C);
        B._Panel.Hide();
};

function FCKTextColorCommand_AutoOnClick(A, B)
{
        this.className = 'ColorDeselected';
        B.SetColor('');
        B._Panel.Hide();
};

function FCKTextColorCommand_MoreOnClick(A, B)
{
        this.className = 'ColorDeselected';
        B._Panel.Hide();
        FCKDialog.OpenDialog('FCKDialog_Color', FCKLang.DlgColorTitle, 'dialog/fck_colorselector.html', 410, 320, FCKTools.Bind(B, B.SetColor));
};
FCKTextColorCommand.prototype._CreatePanelBody = function (A, B)
{
        function CreateSelectionDiv()
        {
                var C = A.createElement("DIV");
                C.className = 'ColorDeselected';
                FCKTools.AddEventListenerEx(C, 'mouseover', FCKTextColorCommand_OnMouseOver);
                FCKTools.AddEventListenerEx(C, 'mouseout', FCKTextColorCommand_OnMouseOut);
                return C;
        };
        var D = B.appendChild(A.createElement("TABLE"));
        D.className = 'ForceBaseFont';
        D.style.tableLayout = 'fixed';
        D.cellPadding = 0;
        D.cellSpacing = 0;
        D.border = 0;
        D.width = 150;
        var E = D.insertRow(-1).insertCell(-1);
        E.colSpan = 8;
        var C = E.appendChild(CreateSelectionDiv());
        C.innerHTML = '<table cellspacing="0" cellpadding="0" width="100%" border="0">\n			<tr>\n				<td><div class="ColorBoxBorder"><div class="ColorBox" style="background-color: #000000"></div></div></td>\n				<td nowrap width="100%" align="center">' + FCKLang.ColorAutomatic + '</td>\n			</tr>\n		</table>';
        FCKTools.AddEventListenerEx(C, 'click', FCKTextColorCommand_AutoOnClick, this);
        if (!FCKBrowserInfo.IsIE) C.style.width = '96%';
        var G = FCKConfig.FontColors.toString().split(',');
        var H = 0;
        while (H < G.length)
        {
                var I = D.insertRow(-1);
                for (var i = 0; i < 8; i++, H++)
                {
                        if (H < G.length)
                        {
                                var J = G[H].split('/');
                                var K = '#' + J[0];
                                var L = J[1] || K;
                        };
                        C = I.insertCell(-1).appendChild(CreateSelectionDiv());
                        C.innerHTML = '<div class="ColorBoxBorder"><div class="ColorBox" style="background-color: ' + K + '"></div></div>';
                        if (H >= G.length) C.style.visibility = 'hidden';
                        else FCKTools.AddEventListenerEx(C, 'click', FCKTextColorCommand_OnClick, [this, L]);
                }
        };
        if (FCKConfig.EnableMoreFontColors)
        {
                E = D.insertRow(-1).insertCell(-1);
                E.colSpan = 8;
                C = E.appendChild(CreateSelectionDiv());
                C.innerHTML = '<table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td nowrap align="center">' + FCKLang.ColorMoreColors + '</td></tr></table>';
                FCKTools.AddEventListenerEx(C, 'click', FCKTextColorCommand_MoreOnClick, this);
                if (!FCKBrowserInfo.IsIE) C.style.width = '96%';
        }
};
var FCKPastePlainTextCommand = function ()
        {
                this.Name = 'PasteText';
        };
FCKPastePlainTextCommand.prototype.Execute = function ()
{
        FCK.PasteAsPlainText();
};
FCKPastePlainTextCommand.prototype.GetState = function ()
{
        if (FCK.EditMode != 0) return -1;
        return FCK.GetNamedCommandState('Paste');
};
var FCKPasteWordCommand = function ()
        {
                this.Name = 'PasteWord';
        };
FCKPasteWordCommand.prototype.Execute = function ()
{
        FCK.PasteFromWord();
};
FCKPasteWordCommand.prototype.GetState = function ()
{
        if (FCK.EditMode != 0 || FCKConfig.ForcePasteAsPlainText) return -1;
        else return FCK.GetNamedCommandState('Paste');
};
var FCKTableCommand = function (A)
        {
                this.Name = A;
        };
FCKTableCommand.prototype.Execute = function ()
{
        FCKUndo.SaveUndoStep();
        if (!FCKBrowserInfo.IsGecko)
        {
                switch (this.Name)
                {
                case 'TableMergeRight':
                        return FCKTableHandler.MergeRight();
                case 'TableMergeDown':
                        return FCKTableHandler.MergeDown();
                }
        };
        switch (this.Name)
        {
        case 'TableInsertRowAfter':
                return FCKTableHandler.InsertRow(false);
        case 'TableInsertRowBefore':
                return FCKTableHandler.InsertRow(true);
        case 'TableDeleteRows':
                return FCKTableHandler.DeleteRows();
        case 'TableInsertColumnAfter':
                return FCKTableHandler.InsertColumn(false);
        case 'TableInsertColumnBefore':
                return FCKTableHandler.InsertColumn(true);
        case 'TableDeleteColumns':
                return FCKTableHandler.DeleteColumns();
        case 'TableInsertCellAfter':
                return FCKTableHandler.InsertCell(null, false);
        case 'TableInsertCellBefore':
                return FCKTableHandler.InsertCell(null, true);
        case 'TableDeleteCells':
                return FCKTableHandler.DeleteCells();
        case 'TableMergeCells':
                return FCKTableHandler.MergeCells();
        case 'TableHorizontalSplitCell':
                return FCKTableHandler.HorizontalSplitCell();
        case 'TableVerticalSplitCell':
                return FCKTableHandler.VerticalSplitCell();
        case 'TableDelete':
                return FCKTableHandler.DeleteTable();
        default:
                return alert(FCKLang.UnknownCommand.replace(/%1/g, this.Name));
        }
};
FCKTableCommand.prototype.GetState = function ()
{
        if (FCK.EditorDocument != null && FCKSelection.HasAncestorNode('TABLE'))
        {
                switch (this.Name)
                {
                case 'TableHorizontalSplitCell':
                case 'TableVerticalSplitCell':
                        if (FCKTableHandler.GetSelectedCells().length == 1) return 0;
                        else return -1;
                case 'TableMergeCells':
                        if (FCKTableHandler.CheckIsSelectionRectangular() && FCKTableHandler.GetSelectedCells().length > 1) return 0;
                        else return -1;
                case 'TableMergeRight':
                        return FCKTableHandler.GetMergeRightTarget() ? 0 : -1;
                case 'TableMergeDown':
                        return FCKTableHandler.GetMergeDownTarget() ? 0 : -1;
                default:
                        return 0;
                }
        }
        else return -1;
};
var FCKFitWindow = function ()
        {
                this.Name = 'FitWindow';
        };
FCKFitWindow.prototype.Execute = function ()
{
        var A = window.frameElement;
        var B = A.style;
        var C = parent;
        var D = C.document.documentElement;
        var E = C.document.body;
        var F = E.style;
        var G;
        var H, oEditorScrollPos;
        if (FCK.EditMode == 0)
        {
                H = new FCKDomRange(FCK.EditorWindow);
                H.MoveToSelection();
                oEditorScrollPos = FCKTools.GetScrollPosition(FCK.EditorWindow);
        }
        else
        {
                var I = FCK.EditingArea.Textarea;
                H = !FCKBrowserInfo.IsIE && [I.selectionStart, I.selectionEnd];
                oEditorScrollPos = [I.scrollLeft, I.scrollTop];
        };
        if (!this.IsMaximized)
        {
                if (FCKBrowserInfo.IsIE) C.attachEvent('onresize', FCKFitWindow_Resize);
                else C.addEventListener('resize', FCKFitWindow_Resize, true);
                this._ScrollPos = FCKTools.GetScrollPosition(C);
                G = A;
                while ((G = G.parentNode))
                {
                        if (G.nodeType == 1)
                        {
                                G._fckSavedStyles = FCKTools.SaveStyles(G);
                                G.style.zIndex = FCKConfig.FloatingPanelsZIndex - 1;
                        }
                };
                if (FCKBrowserInfo.IsIE)
                {
                        this.documentElementOverflow = D.style.overflow;
                        D.style.overflow = 'hidden';
                        F.overflow = 'hidden';
                }
                else
                {
                        F.overflow = 'hidden';
                        F.width = '0px';
                        F.height = '0px';
                };
                this._EditorFrameStyles = FCKTools.SaveStyles(A);
                var J = FCKTools.GetViewPaneSize(C);
                B.position = "absolute";
                A.offsetLeft;
                B.zIndex = FCKConfig.FloatingPanelsZIndex - 1;
                B.left = "0px";
                B.top = "0px";
                B.width = J.Width + "px";
                B.height = J.Height + "px";
                if (!FCKBrowserInfo.IsIE)
                {
                        B.borderRight = B.borderBottom = "9999px solid white";
                        B.backgroundColor = "white";
                };
                C.scrollTo(0, 0);
                var K = FCKTools.GetWindowPosition(C, A);
                if (K.x != 0) B.left = (-1 * K.x) + "px";
                if (K.y != 0) B.top = (-1 * K.y) + "px";
                this.IsMaximized = true;
        }
        else
        {
                if (FCKBrowserInfo.IsIE) C.detachEvent("onresize", FCKFitWindow_Resize);
                else C.removeEventListener("resize", FCKFitWindow_Resize, true);
                G = A;
                while ((G = G.parentNode))
                {
                        if (G._fckSavedStyles)
                        {
                                FCKTools.RestoreStyles(G, G._fckSavedStyles);
                                G._fckSavedStyles = null;
                        }
                };
                if (FCKBrowserInfo.IsIE) D.style.overflow = this.documentElementOverflow;
                FCKTools.RestoreStyles(A, this._EditorFrameStyles);
                C.scrollTo(this._ScrollPos.X, this._ScrollPos.Y);
                this.IsMaximized = false;
        };
        FCKToolbarItems.GetItem('FitWindow').RefreshState();
        if (FCK.EditMode == 0) FCK.EditingArea.MakeEditable();
        FCK.Focus();
        if (FCK.EditMode == 0)
        {
                H.Select();
                FCK.EditorWindow.scrollTo(oEditorScrollPos.X, oEditorScrollPos.Y);
        }
        else
        {
                if (!FCKBrowserInfo.IsIE)
                {
                        I.selectionStart = H[0];
                        I.selectionEnd = H[1];
                };
                I.scrollLeft = oEditorScrollPos[0];
                I.scrollTop = oEditorScrollPos[1];
        }
};
FCKFitWindow.prototype.GetState = function ()
{
        if (FCKConfig.ToolbarLocation != 'In') return -1;
        else return (this.IsMaximized ? 1 : 0);
};

function FCKFitWindow_Resize()
{
        var A = FCKTools.GetViewPaneSize(parent);
        var B = window.frameElement.style;
        B.width = A.Width + 'px';
        B.height = A.Height + 'px';
};
var FCKListCommand = function (A, B)
        {
                this.Name = A;
                this.TagName = B;
        };
FCKListCommand.prototype = {
        GetState: function ()
        {
                if (FCK.EditMode != 0 || !FCK.EditorWindow) return -1;
                var A = FCKSelection.GetBoundaryParentElement(true);
                var B = A;
                while (B)
                {
                        if (B.nodeName.IEquals(['ul', 'ol'])) break;
                        B = B.parentNode;
                };
                if (B && B.nodeName.IEquals(this.TagName)) return 1;
                else return 0;
        },
        Execute: function ()
        {
                FCKUndo.SaveUndoStep();
                var A = FCK.EditorDocument;
                var B = new FCKDomRange(FCK.EditorWindow);
                B.MoveToSelection();
                var C = this.GetState();
                if (C == 0)
                {
                        FCKDomTools.TrimNode(A.body);
                        if (!A.body.firstChild)
                        {
                                var D = A.createElement('p');
                                A.body.appendChild(D);
                                B.MoveToNodeContents(D);
                        }
                };
                var E = B.CreateBookmark();
                var F = [];
                var G = {};
                var H = new FCKDomRangeIterator(B);
                var I;
                H.ForceBrBreak = (C == 0);
                var J = true;
                var K = null;
                while (J)
                {
                        while ((I = H.GetNextParagraph()))
                        {
                                var L = new FCKElementPath(I);
                                var M = null;
                                var N = false;
                                var O = L.BlockLimit;
                                for (var i = L.Elements.length - 1; i >= 0; i--)
                                {
                                        var P = L.Elements[i];
                                        if (P.nodeName.IEquals(['ol', 'ul']))
                                        {
                                                if (O._FCK_ListGroupObject) O._FCK_ListGroupObject = null;
                                                var Q = P._FCK_ListGroupObject;
                                                if (Q) Q.contents.push(I);
                                                else
                                                {
                                                        Q = {
                                                                'root': P,
                                                                'contents': [I]
                                                        };
                                                        F.push(Q);
                                                        FCKDomTools.SetElementMarker(G, P, '_FCK_ListGroupObject', Q);
                                                };
                                                N = true;
                                                break;
                                        }
                                };
                                if (N) continue;
                                var R = O;
                                if (R._FCK_ListGroupObject) R._FCK_ListGroupObject.contents.push(I);
                                else
                                {
                                        var Q = {
                                                'root': R,
                                                'contents': [I]
                                        };
                                        FCKDomTools.SetElementMarker(G, R, '_FCK_ListGroupObject', Q);
                                        F.push(Q);
                                }
                        };
                        if (FCKBrowserInfo.IsIE) J = false;
                        else
                        {
                                if (K == null)
                                {
                                        K = [];
                                        var T = FCKSelection.GetSelection();
                                        if (T && F.length == 0) K.push(T.getRangeAt(0));
                                        for (var i = 1; T && i < T.rangeCount; i++) K.push(T.getRangeAt(i));
                                };
                                if (K.length < 1) J = false;
                                else
                                {
                                        var U = FCKW3CRange.CreateFromRange(A, K.shift());
                                        B._Range = U;
                                        B._UpdateElementInfo();
                                        if (B.StartNode.nodeName.IEquals('td')) B.SetStart(B.StartNode, 1);
                                        if (B.EndNode.nodeName.IEquals('td')) B.SetEnd(B.EndNode, 2);
                                        H = new FCKDomRangeIterator(B);
                                        H.ForceBrBreak = (C == 0);
                                }
                        }
                };
                var W = [];
                while (F.length > 0)
                {
                        var Q = F.shift();
                        if (C == 0)
                        {
                                if (Q.root.nodeName.IEquals(['ul', 'ol'])) this._ChangeListType(Q, G, W);
                                else this._CreateList(Q, W);
                        }
                        else if (C == 1 && Q.root.nodeName.IEquals(['ul', 'ol'])) this._RemoveList(Q, G);
                };
                for (var i = 0; i < W.length; i++)
                {
                        var M = W[i];
                        var Z = false;
                        var a = M;
                        while (!Z)
                        {
                                a = a.nextSibling;
                                if (a && a.nodeType == 3 && a.nodeValue.search(/^[\n\r\t ]*$/) == 0) continue;
                                Z = true;
                        };
                        if (a && a.nodeName.IEquals(this.TagName))
                        {
                                a.parentNode.removeChild(a);
                                while (a.firstChild) M.appendChild(a.removeChild(a.firstChild));
                        };
                        Z = false;
                        a = M;
                        while (!Z)
                        {
                                a = a.previousSibling;
                                if (a && a.nodeType == 3 && a.nodeValue.search(/^[\n\r\t ]*$/) == 0) continue;
                                Z = true;
                        };
                        if (a && a.nodeName.IEquals(this.TagName))
                        {
                                a.parentNode.removeChild(a);
                                while (a.lastChild) M.insertBefore(a.removeChild(a.lastChild), M.firstChild);
                        }
                };
                FCKDomTools.ClearAllMarkers(G);
                B.MoveToBookmark(E);
                B.Select();
                FCK.Focus();
                FCK.Events.FireEvent('OnSelectionChange');
        },
        _ChangeListType: function (A, B, C)
        {
                var D = FCKDomTools.ListToArray(A.root, B);
                var E = [];
                for (var i = 0; i < A.contents.length; i++)
                {
                        var F = A.contents[i];
                        F = FCKTools.GetElementAscensor(F, 'li');
                        if (!F || F._FCK_ListItem_Processed) continue;
                        E.push(F);
                        FCKDomTools.SetElementMarker(B, F, '_FCK_ListItem_Processed', true);
                };
                var G = FCKTools.GetElementDocument(A.root).createElement(this.TagName);
                for (var i = 0; i < E.length; i++)
                {
                        var H = E[i]._FCK_ListArray_Index;
                        D[H].parent = G;
                };
                var I = FCKDomTools.ArrayToList(D, B);
                for (var i = 0; i < I.listNode.childNodes.length; i++)
                {
                        if (I.listNode.childNodes[i].nodeName.IEquals(this.TagName)) C.push(I.listNode.childNodes[i]);
                };
                A.root.parentNode.replaceChild(I.listNode, A.root);
        },
        _CreateList: function (A, B)
        {
                var C = A.contents;
                var D = FCKTools.GetElementDocument(A.root);
                var E = [];
                if (C.length == 1 && C[0] == A.root)
                {
                        var F = D.createElement('div');
                        while (C[0].firstChild) F.appendChild(C[0].removeChild(C[0].firstChild));
                        C[0].appendChild(F);
                        C[0] = F;
                };
                var G = A.contents[0].parentNode;
                for (var i = 0; i < C.length; i++) G = FCKDomTools.GetCommonParents(G, C[i].parentNode).pop();
                for (var i = 0; i < C.length; i++)
                {
                        var H = C[i];
                        while (H.parentNode)
                        {
                                if (H.parentNode == G)
                                {
                                        E.push(H);
                                        break;
                                };
                                H = H.parentNode;
                        }
                };
                if (E.length < 1) return;
                var I = E[E.length - 1].nextSibling;
                var J = D.createElement(this.TagName);
                B.push(J);
                while (E.length)
                {
                        var K = E.shift();
                        var L = D.createDocumentFragment();
                        while (K.firstChild) L.appendChild(K.removeChild(K.firstChild));
                        K.parentNode.removeChild(K);
                        var M = D.createElement('li');
                        M.appendChild(L);
                        J.appendChild(M);
                };
                G.insertBefore(J, I);
        },
        _RemoveList: function (A, B)
        {
                var C = FCKDomTools.ListToArray(A.root, B);
                var D = [];
                for (var i = 0; i < A.contents.length; i++)
                {
                        var E = A.contents[i];
                        E = FCKTools.GetElementAscensor(E, 'li');
                        if (!E || E._FCK_ListItem_Processed) continue;
                        D.push(E);
                        FCKDomTools.SetElementMarker(B, E, '_FCK_ListItem_Processed', true);
                };
                var F = null;
                for (var i = 0; i < D.length; i++)
                {
                        var G = D[i]._FCK_ListArray_Index;
                        C[G].indent = -1;
                        F = G;
                };
                for (var i = F + 1; i < C.length; i++)
                {
                        if (C[i].indent > C[i - 1].indent + 1)
                        {
                                var H = C[i - 1].indent + 1 - C[i].indent;
                                var I = C[i].indent;
                                while (C[i] && C[i].indent >= I)
                                {
                                        C[i].indent += H;
                                        i++;
                                };
                                i--;
                        }
                };
                var J = FCKDomTools.ArrayToList(C, B);
                if (A.root.nextSibling == null || A.root.nextSibling.nodeName.IEquals('br'))
                {
                        if (J.listNode.lastChild.nodeName.IEquals('br')) J.listNode.removeChild(J.listNode.lastChild);
                };
                A.root.parentNode.replaceChild(J.listNode, A.root);
        }
};
var FCKJustifyCommand = function (A)
        {
                this.AlignValue = A;
                var B = FCKConfig.ContentLangDirection.toLowerCase();
                this.IsDefaultAlign = (A == 'left' && B == 'ltr') || (A == 'right' && B == 'rtl');
                var C = this._CssClassName = (function ()
                {
                        var D = FCKConfig.JustifyClasses;
                        if (D)
                        {
                                switch (A)
                                {
                                case 'left':
                                        return D[0] || null;
                                case 'center':
                                        return D[1] || null;
                                case 'right':
                                        return D[2] || null;
                                case 'justify':
                                        return D[3] || null;
                                }
                        };
                        return null;
                })();
                if (C && C.length > 0) this._CssClassRegex = new RegExp('(?:^|\\s+)' + C + '(?=$|\\s)');
        };
FCKJustifyCommand._GetClassNameRegex = function ()
{
        var A = FCKJustifyCommand._ClassRegex;
        if (A != undefined) return A;
        var B = [];
        var C = FCKConfig.JustifyClasses;
        if (C)
        {
                for (var i = 0; i < 4; i++)
                {
                        var D = C[i];
                        if (D && D.length > 0) B.push(D);
                }
        };
        if (B.length > 0) A = new RegExp('(?:^|\\s+)(?:' + B.join('|') + ')(?=$|\\s)');
        else A = null;
        return FCKJustifyCommand._ClassRegex = A;
};
FCKJustifyCommand.prototype = {
        Execute: function ()
        {
                FCKUndo.SaveUndoStep();
                var A = new FCKDomRange(FCK.EditorWindow);
                A.MoveToSelection();
                var B = this.GetState();
                if (B == -1) return;
                var C = A.CreateBookmark();
                var D = this._CssClassName;
                var E = new FCKDomRangeIterator(A);
                var F;
                while ((F = E.GetNextParagraph()))
                {
                        F.removeAttribute('align');
                        if (D)
                        {
                                var G = F.className.replace(FCKJustifyCommand._GetClassNameRegex(), '');
                                if (B == 0)
                                {
                                        if (G.length > 0) G += ' ';
                                        F.className = G + D;
                                }
                                else if (G.length == 0) FCKDomTools.RemoveAttribute(F, 'class');
                        }
                        else
                        {
                                var H = F.style;
                                if (B == 0) H.textAlign = this.AlignValue;
                                else
                                {
                                        H.textAlign = '';
                                        if (H.cssText.length == 0) F.removeAttribute('style');
                                }
                        }
                };
                A.MoveToBookmark(C);
                A.Select();
                FCK.Focus();
                FCK.Events.FireEvent('OnSelectionChange');
        },
        GetState: function ()
        {
                if (FCK.EditMode != 0 || !FCK.EditorWindow) return -1;
                var A = new FCKElementPath(FCKSelection.GetBoundaryParentElement(true));
                var B = A.Block || A.BlockLimit;
                if (!B || B.nodeName.toLowerCase() == 'body') return 0;
                var C;
                if (FCKBrowserInfo.IsIE) C = B.currentStyle.textAlign;
                else C = FCK.EditorWindow.getComputedStyle(B, '').getPropertyValue('text-align');
                C = C.replace(/(-moz-|-webkit-|start|auto)/i, '');
                if ((!C && this.IsDefaultAlign) || C == this.AlignValue) return 1;
                return 0;
        }
};
var FCKIndentCommand = function (A, B)
        {
                this.Name = A;
                this.Offset = B;
                this.IndentCSSProperty = FCKConfig.ContentLangDirection.IEquals('ltr') ? 'marginLeft' : 'marginRight';
        };
FCKIndentCommand._InitIndentModeParameters = function ()
{
        if (FCKConfig.IndentClasses && FCKConfig.IndentClasses.length > 0)
        {
                this._UseIndentClasses = true;
                this._IndentClassMap = {};
                for (var i = 0; i < FCKConfig.IndentClasses.length; i++) this._IndentClassMap[FCKConfig.IndentClasses[i]] = i + 1;
                this._ClassNameRegex = new RegExp('(?:^|\\s+)(' + FCKConfig.IndentClasses.join('|') + ')(?=$|\\s)');
        }
        else this._UseIndentClasses = false;
};
FCKIndentCommand.prototype = {
        Execute: function ()
        {
                FCKUndo.SaveUndoStep();
                var A = new FCKDomRange(FCK.EditorWindow);
                A.MoveToSelection();
                var B = A.CreateBookmark();
                var C = FCKDomTools.GetCommonParentNode(A.StartNode || A.StartContainer, A.EndNode || A.EndContainer, ['ul', 'ol']);
                if (C) this._IndentList(A, C);
                else this._IndentBlock(A);
                A.MoveToBookmark(B);
                A.Select();
                FCK.Focus();
                FCK.Events.FireEvent('OnSelectionChange');
        },
        GetState: function ()
        {
                if (FCK.EditMode != 0 || !FCK.EditorWindow) return -1;
                if (FCKIndentCommand._UseIndentClasses == undefined) FCKIndentCommand._InitIndentModeParameters();
                var A = FCKSelection.GetBoundaryParentElement(true);
                var B = FCKSelection.GetBoundaryParentElement(false);
                var C = FCKDomTools.GetCommonParentNode(A, B, ['ul', 'ol']);
                if (C)
                {
                        if (this.Name.IEquals('outdent')) return 0;
                        var D = FCKTools.GetElementAscensor(A, 'li');
                        if (!D || !D.previousSibling) return -1;
                        return 0;
                };
                if (!FCKIndentCommand._UseIndentClasses && this.Name.IEquals('indent')) return 0;
                var E = new FCKElementPath(A);
                var F = E.Block || E.BlockLimit;
                if (!F) return -1;
                if (FCKIndentCommand._UseIndentClasses)
                {
                        var G = F.className.match(FCKIndentCommand._ClassNameRegex);
                        var H = 0;
                        if (G != null)
                        {
                                G = G[1];
                                H = FCKIndentCommand._IndentClassMap[G];
                        };
                        if ((this.Name == 'outdent' && H == 0) || (this.Name == 'indent' && H == FCKConfig.IndentClasses.length)) return -1;
                        return 0;
                }
                else
                {
                        var I = parseInt(F.style[this.IndentCSSProperty], 10);
                        if (isNaN(I)) I = 0;
                        if (I <= 0) return -1;
                        return 0;
                }
        },
        _IndentBlock: function (A)
        {
                var B = new FCKDomRangeIterator(A);
                B.EnforceRealBlocks = true;
                A.Expand('block_contents');
                var C = FCKDomTools.GetCommonParents(A.StartContainer, A.EndContainer);
                var D = C[C.length - 1];
                var E;
                while ((E = B.GetNextParagraph()))
                {
                        if (!(E == D || E.parentNode == D)) continue;
                        if (FCKIndentCommand._UseIndentClasses)
                        {
                                var F = E.className.match(FCKIndentCommand._ClassNameRegex);
                                var G = 0;
                                if (F != null)
                                {
                                        F = F[1];
                                        G = FCKIndentCommand._IndentClassMap[F];
                                };
                                if (this.Name.IEquals('outdent')) G--;
                                else if (this.Name.IEquals('indent')) G++;
                                G = Math.min(G, FCKConfig.IndentClasses.length);
                                G = Math.max(G, 0);
                                var H = E.className.replace(FCKIndentCommand._ClassNameRegex, '');
                                if (G < 1) E.className = H;
                                else E.className = (H.length > 0 ? H + ' ' : '') + FCKConfig.IndentClasses[G - 1];
                        }
                        else
                        {
                                var I = parseInt(E.style[this.IndentCSSProperty], 10);
                                if (isNaN(I)) I = 0;
                                I += this.Offset;
                                I = Math.max(I, 0);
                                I = Math.ceil(I / this.Offset) * this.Offset;
                                E.style[this.IndentCSSProperty] = I ? I + FCKConfig.IndentUnit : '';
                                if (E.getAttribute('style') == '') E.removeAttribute('style');
                        }
                }
        },
        _IndentList: function (A, B)
        {
                var C = A.StartContainer;
                var D = A.EndContainer;
                while (C && C.parentNode != B) C = C.parentNode;
                while (D && D.parentNode != B) D = D.parentNode;
                if (!C || !D) return;
                var E = C;
                var F = [];
                var G = false;
                while (G == false)
                {
                        if (E == D) G = true;
                        F.push(E);
                        E = E.nextSibling;
                };
                if (F.length < 1) return;
                var H = FCKDomTools.GetParents(B);
                for (var i = 0; i < H.length; i++)
                {
                        if (H[i].nodeName.IEquals(['ul', 'ol']))
                        {
                                B = H[i];
                                break;
                        }
                };
                var I = this.Name.IEquals('indent') ? 1 : -1;
                var J = F[0];
                var K = F[F.length - 1];
                var L = {};
                var M = FCKDomTools.ListToArray(B, L);
                var N = M[K._FCK_ListArray_Index].indent;
                for (var i = J._FCK_ListArray_Index; i <= K._FCK_ListArray_Index; i++) M[i].indent += I;
                for (var i = K._FCK_ListArray_Index + 1; i < M.length && M[i].indent > N; i++) M[i].indent += I;
                var O = FCKDomTools.ArrayToList(M);
                if (O) B.parentNode.replaceChild(O.listNode, B);
                FCKDomTools.ClearAllMarkers(L);
        }
};
var FCKBlockQuoteCommand = function ()
        {};
FCKBlockQuoteCommand.prototype = {
        Execute: function ()
        {
                FCKUndo.SaveUndoStep();
                var A = this.GetState();
                var B = new FCKDomRange(FCK.EditorWindow);
                B.MoveToSelection();
                var C = B.CreateBookmark();
                if (FCKBrowserInfo.IsIE)
                {
                        var D = B.GetBookmarkNode(C, true);
                        var E = B.GetBookmarkNode(C, false);
                        var F;
                        if (D && D.parentNode.nodeName.IEquals('blockquote') && !D.previousSibling)
                        {
                                F = D;
                                while ((F = F.nextSibling))
                                {
                                        if (FCKListsLib.BlockElements[F.nodeName.toLowerCase()]) FCKDomTools.MoveNode(D, F, true);
                                }
                        };
                        if (E && E.parentNode.nodeName.IEquals('blockquote') && !E.previousSibling)
                        {
                                F = E;
                                while ((F = F.nextSibling))
                                {
                                        if (FCKListsLib.BlockElements[F.nodeName.toLowerCase()])
                                        {
                                                if (F.firstChild == D) FCKDomTools.InsertAfterNode(D, E);
                                                else FCKDomTools.MoveNode(E, F, true);
                                        }
                                }
                        }
                };
                var G = new FCKDomRangeIterator(B);
                var H;
                if (A == 0)
                {
                        var I = [];
                        while ((H = G.GetNextParagraph())) I.push(H);
                        if (I.length < 1)
                        {
                                para = B.Window.document.createElement(FCKConfig.EnterMode.IEquals('p') ? 'p' : 'div');
                                B.InsertNode(para);
                                para.appendChild(B.Window.document.createTextNode('\ufeff'));
                                B.MoveToBookmark(C);
                                B.MoveToNodeContents(para);
                                B.Collapse(true);
                                C = B.CreateBookmark();
                                I.push(para);
                        };
                        var J = I[0].parentNode;
                        var K = [];
                        for (var i = 0; i < I.length; i++)
                        {
                                H = I[i];
                                J = FCKDomTools.GetCommonParents(H.parentNode, J).pop();
                        }
                        while (J.nodeName.IEquals('table', 'tbody', 'tr', 'ol', 'ul')) J = J.parentNode;
                        var L = null;
                        while (I.length > 0)
                        {
                                H = I.shift();
                                while (H.parentNode != J) H = H.parentNode;
                                if (H != L) K.push(H);
                                L = H;
                        }
                        while (K.length > 0)
                        {
                                H = K.shift();
                                if (H.nodeName.IEquals('blockquote'))
                                {
                                        var M = FCKTools.GetElementDocument(H).createDocumentFragment();
                                        while (H.firstChild)
                                        {
                                                M.appendChild(H.removeChild(H.firstChild));
                                                I.push(M.lastChild);
                                        };
                                        H.parentNode.replaceChild(M, H);
                                }
                                else I.push(H);
                        };
                        var N = B.Window.document.createElement('blockquote');
                        J.insertBefore(N, I[0]);
                        while (I.length > 0)
                        {
                                H = I.shift();
                                N.appendChild(H);
                        }
                }
                else if (A == 1)
                {
                        var O = [];
                        var P = {};
                        while ((H = G.GetNextParagraph()))
                        {
                                var Q = null;
                                var R = null;
                                while (H.parentNode)
                                {
                                        if (H.parentNode.nodeName.IEquals('blockquote'))
                                        {
                                                Q = H.parentNode;
                                                R = H;
                                                break;
                                        };
                                        H = H.parentNode;
                                };
                                if (Q && R && !R._fckblockquotemoveout)
                                {
                                        O.push(R);
                                        FCKDomTools.SetElementMarker(P, R, '_fckblockquotemoveout', true);
                                }
                        };
                        FCKDomTools.ClearAllMarkers(P);
                        var S = [];
                        var T = [],
                                P = {};
                        var U = function (N)
                                {
                                        for (var i = 0; i < N.childNodes.length; i++)
                                        {
                                                if (FCKListsLib.BlockElements[N.childNodes[i].nodeName.toLowerCase()]) return false;
                                        };
                                        return true;
                                };
                        while (O.length > 0)
                        {
                                var W = O.shift();
                                var N = W.parentNode;
                                if (W == W.parentNode.firstChild) N.parentNode.insertBefore(N.removeChild(W), N);
                                else if (W == W.parentNode.lastChild) N.parentNode.insertBefore(N.removeChild(W), N.nextSibling);
                                else FCKDomTools.BreakParent(W, W.parentNode, B);
                                if (!N._fckbqprocessed)
                                {
                                        T.push(N);
                                        FCKDomTools.SetElementMarker(P, N, '_fckbqprocessed', true);
                                };
                                S.push(W);
                        };
                        for (var i = T.length - 1; i >= 0; i--)
                        {
                                var N = T[i];
                                if (U(N)) FCKDomTools.RemoveNode(N);
                        };
                        FCKDomTools.ClearAllMarkers(P);
                        if (FCKConfig.EnterMode.IEquals('br'))
                        {
                                while (S.length)
                                {
                                        var W = S.shift();
                                        var a = true;
                                        if (W.nodeName.IEquals('div'))
                                        {
                                                var M = FCKTools.GetElementDocument(W).createDocumentFragment();
                                                var c = a && W.previousSibling && !FCKListsLib.BlockBoundaries[W.previousSibling.nodeName.toLowerCase()];
                                                if (a && c) M.appendChild(FCKTools.GetElementDocument(W).createElement('br'));
                                                var d = W.nextSibling && !FCKListsLib.BlockBoundaries[W.nextSibling.nodeName.toLowerCase()];
                                                while (W.firstChild) M.appendChild(W.removeChild(W.firstChild));
                                                if (d) M.appendChild(FCKTools.GetElementDocument(W).createElement('br'));
                                                W.parentNode.replaceChild(M, W);
                                                a = false;
                                        }
                                }
                        }
                };
                B.MoveToBookmark(C);
                B.Select();
                FCK.Focus();
                FCK.Events.FireEvent('OnSelectionChange');
        },
        GetState: function ()
        {
                if (FCK.EditMode != 0 || !FCK.EditorWindow) return -1;
                var A = new FCKElementPath(FCKSelection.GetBoundaryParentElement(true));
                var B = A.Block || A.BlockLimit;
                if (!B || B.nodeName.toLowerCase() == 'body') return 0;
                for (var i = 0; i < A.Elements.length; i++)
                {
                        if (A.Elements[i].nodeName.IEquals('blockquote')) return 1;
                };
                return 0;
        }
};
var FCKCoreStyleCommand = function (A)
        {
                this.Name = 'CoreStyle';
                this.StyleName = '_FCK_' + A;
                this.IsActive = false;
                FCKStyles.AttachStyleStateChange(this.StyleName, this._OnStyleStateChange, this);
        };
FCKCoreStyleCommand.prototype = {
        Execute: function ()
        {
                FCKUndo.SaveUndoStep();
                if (this.IsActive) FCKStyles.RemoveStyle(this.StyleName);
                else FCKStyles.ApplyStyle(this.StyleName);
                FCK.Focus();
                FCK.Events.FireEvent('OnSelectionChange');
        },
        GetState: function ()
        {
                if (FCK.EditMode != 0) return -1;
                return this.IsActive ? 1 : 0;
        },
        _OnStyleStateChange: function (A, B)
        {
                this.IsActive = B;
        }
};
var FCKRemoveFormatCommand = function ()
        {
                this.Name = 'RemoveFormat';
        };
FCKRemoveFormatCommand.prototype = {
        Execute: function ()
        {
                FCKStyles.RemoveAll();
                FCK.Focus();
                FCK.Events.FireEvent('OnSelectionChange');
        },
        GetState: function ()
        {
                return FCK.EditorWindow ? 0 : -1;
        }
};
var FCKCommands = FCK.Commands = {};
FCKCommands.LoadedCommands = {};
FCKCommands.RegisterCommand = function (A, B)
{
        this.LoadedCommands[A] = B;
};
FCKCommands.GetCommand = function (A)
{
        var B = FCKCommands.LoadedCommands[A];
        if (B) return B;
        switch (A)
        {
        case 'Bold':
        case 'Italic':
        case 'Underline':
        case 'StrikeThrough':
        case 'Subscript':
        case 'Superscript':
                B = new FCKCoreStyleCommand(A);
                break;
        case 'RemoveFormat':
                B = new FCKRemoveFormatCommand();
                break;
        case 'DocProps':
                B = new FCKDialogCommand('DocProps', FCKLang.DocProps, 'dialog/fck_docprops.html', 400, 380, FCKCommands.GetFullPageState);
                break;
        case 'Templates':
                B = new FCKDialogCommand('Templates', FCKLang.DlgTemplatesTitle, 'dialog/fck_template.html', 380, 450);
                break;
        case 'Link':
                B = new FCKDialogCommand('Link', FCKLang.DlgLnkWindowTitle, 'dialog/fck_link.html', 400, 300);
                break;
        case 'Unlink':
                B = new FCKUnlinkCommand();
                break;
        case 'VisitLink':
                B = new FCKVisitLinkCommand();
                break;
        case 'Anchor':
                B = new FCKDialogCommand('Anchor', FCKLang.DlgAnchorTitle, 'dialog/fck_anchor.html', 370, 160);
                break;
        case 'AnchorDelete':
                B = new FCKAnchorDeleteCommand();
                break;
        case 'BulletedList':
                B = new FCKDialogCommand('BulletedList', FCKLang.BulletedListProp, 'dialog/fck_listprop.html?UL', 370, 160);
                break;
        case 'NumberedList':
                B = new FCKDialogCommand('NumberedList', FCKLang.NumberedListProp, 'dialog/fck_listprop.html?OL', 370, 160);
                break;
        case 'About':
                B = new FCKDialogCommand('About', FCKLang.About, 'dialog/fck_about.html', 420, 330, function ()
                {
                        return 0;
                });
                break;
        case 'Find':
                B = new FCKDialogCommand('Find', FCKLang.DlgFindAndReplaceTitle, 'dialog/fck_replace.html', 340, 230, null, null, 'Find');
                break;
        case 'Replace':
                B = new FCKDialogCommand('Replace', FCKLang.DlgFindAndReplaceTitle, 'dialog/fck_replace.html', 340, 230, null, null, 'Replace');
                break;
        case 'Image':
                B = new FCKDialogCommand('Image', FCKLang.DlgImgTitle, 'dialog/fck_image.html', 450, 390);
                break;
        case 'Flash':
                B = new FCKDialogCommand('Flash', FCKLang.DlgFlashTitle, 'dialog/fck_flash.html', 450, 390);
                break;
        case 'SpecialChar':
                B = new FCKDialogCommand('SpecialChar', FCKLang.DlgSpecialCharTitle, 'dialog/fck_specialchar.html', 400, 290);
                break;
        case 'Smiley':
                B = new FCKDialogCommand('Smiley', FCKLang.DlgSmileyTitle, 'dialog/fck_smiley.html', FCKConfig.SmileyWindowWidth, FCKConfig.SmileyWindowHeight);
                break;
        case 'Table':
                B = new FCKDialogCommand('Table', FCKLang.DlgTableTitle, 'dialog/fck_table.html', 480, 250);
                break;
        case 'TableProp':
                B = new FCKDialogCommand('Table', FCKLang.DlgTableTitle, 'dialog/fck_table.html?Parent', 480, 250);
                break;
        case 'TableCellProp':
                B = new FCKDialogCommand('TableCell', FCKLang.DlgCellTitle, 'dialog/fck_tablecell.html', 550, 240);
                break;
        case 'Style':
                B = new FCKStyleCommand();
                break;
        case 'FontName':
                B = new FCKFontNameCommand();
                break;
        case 'FontSize':
                B = new FCKFontSizeCommand();
                break;
        case 'FontFormat':
                B = new FCKFormatBlockCommand();
                break;
        case 'Source':
                B = new FCKSourceCommand();
                break;
        case 'Preview':
                B = new FCKPreviewCommand();
                break;
        case 'Save':
                B = new FCKSaveCommand();
                break;
        case 'NewPage':
                B = new FCKNewPageCommand();
                break;
        case 'PageBreak':
                B = new FCKPageBreakCommand();
                break;
        case 'Rule':
                B = new FCKRuleCommand();
                break;
        case 'Nbsp':
                B = new FCKNbsp();
                break;
        case 'TextColor':
                B = new FCKTextColorCommand('ForeColor');
                break;
        case 'BGColor':
                B = new FCKTextColorCommand('BackColor');
                break;
        case 'Paste':
                B = new FCKPasteCommand();
                break;
        case 'PasteText':
                B = new FCKPastePlainTextCommand();
                break;
        case 'PasteWord':
                B = new FCKPasteWordCommand();
                break;
        case 'JustifyLeft':
                B = new FCKJustifyCommand('left');
                break;
        case 'JustifyCenter':
                B = new FCKJustifyCommand('center');
                break;
        case 'JustifyRight':
                B = new FCKJustifyCommand('right');
                break;
        case 'JustifyFull':
                B = new FCKJustifyCommand('justify');
                break;
        case 'Indent':
                B = new FCKIndentCommand('indent', FCKConfig.IndentLength);
                break;
        case 'Outdent':
                B = new FCKIndentCommand('outdent', FCKConfig.IndentLength * -1);
                break;
        case 'Blockquote':
                B = new FCKBlockQuoteCommand();
                break;
        case 'CreateDiv':
                B = new FCKDialogCommand('CreateDiv', FCKLang.CreateDiv, 'dialog/fck_div.html', 380, 210, null, null, true);
                break;
        case 'EditDiv':
                B = new FCKDialogCommand('EditDiv', FCKLang.EditDiv, 'dialog/fck_div.html', 380, 210, null, null, false);
                break;
        case 'DeleteDiv':
                B = new FCKDeleteDivCommand();
                break;
        case 'TableInsertRowAfter':
                B = new FCKTableCommand('TableInsertRowAfter');
                break;
        case 'TableInsertRowBefore':
                B = new FCKTableCommand('TableInsertRowBefore');
                break;
        case 'TableDeleteRows':
                B = new FCKTableCommand('TableDeleteRows');
                break;
        case 'TableInsertColumnAfter':
                B = new FCKTableCommand('TableInsertColumnAfter');
                break;
        case 'TableInsertColumnBefore':
                B = new FCKTableCommand('TableInsertColumnBefore');
                break;
        case 'TableDeleteColumns':
                B = new FCKTableCommand('TableDeleteColumns');
                break;
        case 'TableInsertCellAfter':
                B = new FCKTableCommand('TableInsertCellAfter');
                break;
        case 'TableInsertCellBefore':
                B = new FCKTableCommand('TableInsertCellBefore');
                break;
        case 'TableDeleteCells':
                B = new FCKTableCommand('TableDeleteCells');
                break;
        case 'TableMergeCells':
                B = new FCKTableCommand('TableMergeCells');
                break;
        case 'TableMergeRight':
                B = new FCKTableCommand('TableMergeRight');
                break;
        case 'TableMergeDown':
                B = new FCKTableCommand('TableMergeDown');
                break;
        case 'TableHorizontalSplitCell':
                B = new FCKTableCommand('TableHorizontalSplitCell');
                break;
        case 'TableVerticalSplitCell':
                B = new FCKTableCommand('TableVerticalSplitCell');
                break;
        case 'TableDelete':
                B = new FCKTableCommand('TableDelete');
                break;
        case 'Form':
                B = new FCKDialogCommand('Form', FCKLang.Form, 'dialog/fck_form.html', 380, 210);
                break;
        case 'Checkbox':
                B = new FCKDialogCommand('Checkbox', FCKLang.Checkbox, 'dialog/fck_checkbox.html', 380, 200);
                break;
        case 'Radio':
                B = new FCKDialogCommand('Radio', FCKLang.RadioButton, 'dialog/fck_radiobutton.html', 380, 200);
                break;
        case 'TextField':
                B = new FCKDialogCommand('TextField', FCKLang.TextField, 'dialog/fck_textfield.html', 380, 210);
                break;
        case 'Textarea':
                B = new FCKDialogCommand('Textarea', FCKLang.Textarea, 'dialog/fck_textarea.html', 380, 210);
                break;
        case 'HiddenField':
                B = new FCKDialogCommand('HiddenField', FCKLang.HiddenField, 'dialog/fck_hiddenfield.html', 380, 190);
                break;
        case 'Button':
                B = new FCKDialogCommand('Button', FCKLang.Button, 'dialog/fck_button.html', 380, 210);
                break;
        case 'Select':
                B = new FCKDialogCommand('Select', FCKLang.SelectionField, 'dialog/fck_select.html', 400, 340);
                break;
        case 'ImageButton':
                B = new FCKDialogCommand('ImageButton', FCKLang.ImageButton, 'dialog/fck_image.html?ImageButton', 450, 390);
                break;
        case 'SpellCheck':
                B = new FCKSpellCheckCommand();
                break;
        case 'FitWindow':
                B = new FCKFitWindow();
                break;
        case 'Undo':
                B = new FCKUndoCommand();
                break;
        case 'Redo':
                B = new FCKRedoCommand();
                break;
        case 'Copy':
                B = new FCKCutCopyCommand(false);
                break;
        case 'Cut':
                B = new FCKCutCopyCommand(true);
                break;
        case 'SelectAll':
                B = new FCKSelectAllCommand();
                break;
        case 'InsertOrderedList':
                B = new FCKListCommand('insertorderedlist', 'ol');
                break;
        case 'InsertUnorderedList':
                B = new FCKListCommand('insertunorderedlist', 'ul');
                break;
        case 'ShowBlocks':
                B = new FCKShowBlockCommand('ShowBlocks', FCKConfig.StartupShowBlocks ? 1 : 0);
                break;
        case 'Undefined':
                B = new FCKUndefinedCommand();
                break;
        case 'Scayt':
                B = FCKScayt.CreateCommand();
                break;
        case 'ScaytContext':
                B = FCKScayt.CreateContextCommand();
                break;
        default:
                if (FCKRegexLib.NamedCommands.test(A)) B = new FCKNamedCommand(A);
                else
                {
                        alert(FCKLang.UnknownCommand.replace(/%1/g, A));
                        return null;
                }
        };
        FCKCommands.LoadedCommands[A] = B;
        return B;
};
FCKCommands.GetFullPageState = function ()
{
        return FCKConfig.FullPage ? 0 : -1;
};
FCKCommands.GetBooleanState = function (A)
{
        return A ? -1 : 0;
};
var FCKPanel = function (A)
        {
                this.IsRTL = (FCKLang.Dir == 'rtl');
                this.IsContextMenu = false;
                this._LockCounter = 0;
                this._Window = A || window;
                var B;
                if (FCKBrowserInfo.IsIE)
                {
                        this._Popup = this._Window.createPopup();
                        var C = this._Window.document;
                        if (FCK_IS_CUSTOM_DOMAIN && !FCKBrowserInfo.IsIE7)
                        {
                                C.domain = FCK_ORIGINAL_DOMAIN;
                                document.domain = FCK_ORIGINAL_DOMAIN;
                        };
                        B = this.Document = this._Popup.document;
                        if (FCK_IS_CUSTOM_DOMAIN)
                        {
                                B.domain = FCK_RUNTIME_DOMAIN;
                                C.domain = FCK_RUNTIME_DOMAIN;
                                document.domain = FCK_RUNTIME_DOMAIN;
                        };
                        FCK.IECleanup.AddItem(this, FCKPanel_Cleanup);
                }
                else
                {
                        var D = this._IFrame = this._Window.document.createElement('iframe');
                        FCKTools.ResetStyles(D);
                        D.src = 'javascript:void(0)';
                        D.allowTransparency = true;
                        D.frameBorder = '0';
                        D.scrolling = 'no';
                        D.style.width = D.style.height = '0px';
                        FCKDomTools.SetElementStyles(D, {
                                position: 'absolute',
                                zIndex: FCKConfig.FloatingPanelsZIndex
                        });
                        this._Window.document.body.appendChild(D);
                        var E = D.contentWindow;
                        B = this.Document = E.document;
                        var F = '';
                        if (FCKBrowserInfo.IsSafari) F = '<base href="' + window.document.location + '">';
                        B.open();
                        B.write('<html><head>' + F + '<\/head><body style="margin:0px;padding:0px;"><\/body><\/html>');
                        B.close();
                        if (FCKBrowserInfo.IsAIR) FCKAdobeAIR.Panel_Contructor(B, window.document.location);
                        FCKTools.AddEventListenerEx(E, 'focus', FCKPanel_Window_OnFocus, this);
                        FCKTools.AddEventListenerEx(E, 'blur', FCKPanel_Window_OnBlur, this);
                };
                B.dir = FCKLang.Dir;
                FCKTools.AddEventListener(B, 'contextmenu', FCKTools.CancelEvent);
                this.MainNode = B.body.appendChild(B.createElement('DIV'));
                this.MainNode.style.cssFloat = this.IsRTL ? 'right' : 'left';
        };
FCKPanel.prototype.AppendStyleSheet = function (A)
{
        FCKTools.AppendStyleSheet(this.Document, A);
};
FCKPanel.prototype.Preload = function (x, y, A)
{
        if (this._Popup) this._Popup.show(x, y, 0, 0, A);
};
FCKPanel.prototype.ResizeForSubpanel = function (A, B, C)
{
        if (!FCKBrowserInfo.IsIE7) return false;
        if (!this._Popup.isOpen)
        {
                this.Subpanel = null;
                return false;
        };
        if (B == 0 && C == 0)
        {
                if (this.Subpanel !== A) return false;
                this.Subpanel = null;
                this.IncreasedX = 0;
        }
        else
        {
                this.Subpanel = A;
                if ((this.IncreasedX >= B) && (this.IncreasedY >= C)) return false;
                this.IncreasedX = Math.max(this.IncreasedX, B);
                this.IncreasedY = Math.max(this.IncreasedY, C);
        };
        var x = this.ShowRect.x;
        var w = this.IncreasedX;
        if (this.IsRTL) x = x - w;
        var D = this.ShowRect.w + w;
        var E = Math.max(this.ShowRect.h, this.IncreasedY);
        if (this.ParentPanel) this.ParentPanel.ResizeForSubpanel(this, D, E);
        this._Popup.show(x, this.ShowRect.y, D, E, this.RelativeElement);
        return this.IsRTL;
};
FCKPanel.prototype.Show = function (x, y, A, B, C)
{
        var D;
        var E = this.MainNode;
        if (this._Popup)
        {
                this._Popup.show(x, y, 0, 0, A);
                FCKDomTools.SetElementStyles(E, {
                        B: B ? B + 'px' : '',
                        C: C ? C + 'px' : ''
                });
                D = E.offsetWidth;
                if (FCKBrowserInfo.IsIE7)
                {
                        if (this.ParentPanel && this.ParentPanel.ResizeForSubpanel(this, D, E.offsetHeight))
                        {
                                FCKTools.RunFunction(this.Show, this, [x, y, A]);
                                return;
                        }
                };
                if (this.IsRTL)
                {
                        if (this.IsContextMenu) x = x - D + 1;
                        else if (A) x = (x * -1) + A.offsetWidth - D;
                };
                if (FCKBrowserInfo.IsIE7)
                {
                        this.ShowRect = {
                                x: x,
                                y: y,
                                w: D,
                                h: E.offsetHeight
                        };
                        this.IncreasedX = 0;
                        this.IncreasedY = 0;
                        this.RelativeElement = A;
                };
                this._PopupArgs = [x, y, D, E.offsetHeight, A];
                this._Popup.show(x, y, D, E.offsetHeight, A);
                if (this.OnHide)
                {
                        if (this._Timer) CheckPopupOnHide.call(this, true);
                        this._Timer = FCKTools.SetInterval(CheckPopupOnHide, 100, this);
                }
        }
        else
        {
                if (typeof (FCK.ToolbarSet.CurrentInstance.FocusManager) != 'undefined') FCK.ToolbarSet.CurrentInstance.FocusManager.Lock();
                if (this.ParentPanel)
                {
                        this.ParentPanel.Lock();
                        FCKPanel_Window_OnBlur(null, this.ParentPanel);
                };
                if (FCKBrowserInfo.IsGecko && FCKBrowserInfo.IsMac)
                {
                        this._IFrame.scrolling = '';
                        FCKTools.RunFunction(function ()
                        {
                                this._IFrame.scrolling = 'no';
                        }, this);
                };
                if (FCK.ToolbarSet.CurrentInstance.GetInstanceObject('FCKPanel')._OpenedPanel && FCK.ToolbarSet.CurrentInstance.GetInstanceObject('FCKPanel')._OpenedPanel != this) FCK.ToolbarSet.CurrentInstance.GetInstanceObject('FCKPanel')._OpenedPanel.Hide(false, true);
                FCKDomTools.SetElementStyles(E, {
                        B: B ? B + 'px' : '',
                        C: C ? C + 'px' : ''
                });
                D = E.offsetWidth;
                if (!B) this._IFrame.width = 1;
                if (!C) this._IFrame.height = 1;
                D = E.offsetWidth || E.firstChild.offsetWidth;
                var F = FCKTools.GetDocumentPosition(this._Window, A.nodeType == 9 ? (FCKTools.IsStrictMode(A) ? A.documentElement : A.body) : A);
                var G = FCKDomTools.GetPositionedAncestor(this._IFrame.parentNode);
                if (G)
                {
                        var H = FCKTools.GetDocumentPosition(FCKTools.GetElementWindow(G), G);
                        F.x -= H.x;
                        F.y -= H.y;
                };
                if (this.IsRTL && !this.IsContextMenu) x = (x * -1);
                x += F.x;
                y += F.y;
                if (this.IsRTL)
                {
                        if (this.IsContextMenu) x = x - D + 1;
                        else if (A) x = x + A.offsetWidth - D;
                }
                else
                {
                        var I = FCKTools.GetViewPaneSize(this._Window);
                        var J = FCKTools.GetScrollPosition(this._Window);
                        var K = I.Height + J.Y;
                        var L = I.Width + J.X;
                        if ((x + D) > L) x -= x + D - L;
                        if ((y + E.offsetHeight) > K) y -= y + E.offsetHeight - K;
                };
                FCKDomTools.SetElementStyles(this._IFrame, {
                        left: x + 'px',
                        top: y + 'px'
                });
                this._IFrame.contentWindow.focus();
                this._IsOpened = true;
                var M = this;
                this._resizeTimer = setTimeout(function ()
                {
                        var N = E.offsetWidth || E.firstChild.offsetWidth;
                        var O = E.offsetHeight;
                        M._IFrame.style.width = N + 'px';
                        M._IFrame.style.height = O + 'px';
                }, 0);
                FCK.ToolbarSet.CurrentInstance.GetInstanceObject('FCKPanel')._OpenedPanel = this;
        };
        FCKTools.RunFunction(this.OnShow, this);
};
FCKPanel.prototype.Hide = function (A, B)
{
        if (this._Popup) this._Popup.hide();
        else
        {
                if (!this._IsOpened || this._LockCounter > 0) return;
                if (typeof (FCKFocusManager) != 'undefined' && !B) FCKFocusManager.Unlock();
                this._IFrame.style.width = this._IFrame.style.height = '0px';
                this._IsOpened = false;
                if (this._resizeTimer)
                {
                        clearTimeout(this._resizeTimer);
                        this._resizeTimer = null;
                };
                if (this.ParentPanel) this.ParentPanel.Unlock();
                if (!A) FCKTools.RunFunction(this.OnHide, this);
        }
};
FCKPanel.prototype.CheckIsOpened = function ()
{
        if (this._Popup) return this._Popup.isOpen;
        else return this._IsOpened;
};
FCKPanel.prototype.CreateChildPanel = function ()
{
        var A = this._Popup ? FCKTools.GetDocumentWindow(this.Document) : this._Window;
        var B = new FCKPanel(A);
        B.ParentPanel = this;
        return B;
};
FCKPanel.prototype.Lock = function ()
{
        this._LockCounter++;
};
FCKPanel.prototype.Unlock = function ()
{
        if (--this._LockCounter == 0 && !this.HasFocus) this.Hide();
};

function FCKPanel_Window_OnFocus(e, A)
{
        A.HasFocus = true;
};

function FCKPanel_Window_OnBlur(e, A)
{
        A.HasFocus = false;
        if (A._LockCounter == 0) FCKTools.RunFunction(A.Hide, A);
};

function CheckPopupOnHide(A)
{
        if (A || !this._Popup.isOpen)
        {
                window.clearInterval(this._Timer);
                this._Timer = null;
                if (this._Popup && this.ParentPanel && !A) this.ParentPanel.ResizeForSubpanel(this, 0, 0);
                FCKTools.RunFunction(this.OnHide, this);
        }
};

function FCKPanel_Cleanup()
{
        this._Popup = null;
        this._Window = null;
        this.Document = null;
        this.MainNode = null;
        this.RelativeElement = null;
};
var FCKIcon = function (A)
        {
                var B = A ? typeof (A) : 'undefined';
                switch (B)
                {
                case 'number':
                        this.Path = FCKConfig.SkinPath + 'fck_strip.gif';
                        this.Size = 16;
                        this.Position = A;
                        break;
                case 'undefined':
                        this.Path = FCK_SPACER_PATH;
                        break;
                case 'string':
                        this.Path = A;
                        break;
                default:
                        this.Path = A[0];
                        this.Size = A[1];
                        this.Position = A[2];
                }
        };
FCKIcon.prototype.CreateIconElement = function (A)
{
        var B, eIconImage;
        if (this.Position)
        {
                var C = '-' + ((this.Position - 1) * this.Size) + 'px';
                if (FCKBrowserInfo.IsIE)
                {
                        B = A.createElement('DIV');
                        eIconImage = B.appendChild(A.createElement('IMG'));
                        eIconImage.src = this.Path;
                        eIconImage.style.top = C;
                }
                else
                {
                        B = A.createElement('IMG');
                        B.src = FCK_SPACER_PATH;
                        B.style.backgroundPosition = '0px ' + C;
                        B.style.backgroundImage = 'url("' + this.Path + '")';
                }
        }
        else
        {
                if (FCKBrowserInfo.IsIE)
                {
                        B = A.createElement('DIV');
                        eIconImage = B.appendChild(A.createElement('IMG'));
                        eIconImage.src = this.Path ? this.Path : FCK_SPACER_PATH;
                }
                else
                {
                        B = A.createElement('IMG');
                        B.src = this.Path ? this.Path : FCK_SPACER_PATH;
                }
        };
        B.className = 'TB_Button_Image';
        return B;
};
var FCKToolbarButtonUI = function (A, B, C, D, E, F)
        {
                this.Name = A;
                this.Label = B || A;
                this.Tooltip = C || this.Label;
                this.Style = E || 0;
                this.State = F || 0;
                this.Icon = new FCKIcon(D);
                if (FCK.IECleanup) FCK.IECleanup.AddItem(this, FCKToolbarButtonUI_Cleanup);
        };
FCKToolbarButtonUI.prototype._CreatePaddingElement = function (A)
{
        var B = A.createElement('IMG');
        B.className = 'TB_Button_Padding';
        B.src = FCK_SPACER_PATH;
        return B;
};
FCKToolbarButtonUI.prototype.Create = function (A)
{
        var B = FCKTools.GetElementDocument(A);
        var C = this.MainElement = B.createElement('DIV');
        C.title = this.Tooltip;
        if (FCKBrowserInfo.IsGecko) C.onmousedown = FCKTools.CancelEvent;
        FCKTools.AddEventListenerEx(C, 'mouseover', FCKToolbarButtonUI_OnMouseOver, this);
        FCKTools.AddEventListenerEx(C, 'mouseout', FCKToolbarButtonUI_OnMouseOut, this);
        FCKTools.AddEventListenerEx(C, 'click', FCKToolbarButtonUI_OnClick, this);
        this.ChangeState(this.State, true);
        if (this.Style == 0 && !this.ShowArrow)
        {
                C.appendChild(this.Icon.CreateIconElement(B));
        }
        else
        {
                var D = C.appendChild(B.createElement('TABLE'));
                D.cellPadding = 0;
                D.cellSpacing = 0;
                var E = D.insertRow(-1);
                var F = E.insertCell(-1);
                if (this.Style == 0 || this.Style == 2) F.appendChild(this.Icon.CreateIconElement(B));
                else F.appendChild(this._CreatePaddingElement(B));
                if (this.Style == 1 || this.Style == 2)
                {
                        F = E.insertCell(-1);
                        F.className = 'TB_Button_Text';
                        F.noWrap = true;
                        F.appendChild(B.createTextNode(this.Label));
                };
                if (this.ShowArrow)
                {
                        if (this.Style != 0)
                        {
                                E.insertCell(-1).appendChild(this._CreatePaddingElement(B));
                        };
                        F = E.insertCell(-1);
                        var G = F.appendChild(B.createElement('IMG'));
                        G.src = FCKConfig.SkinPath + 'images/toolbar.buttonarrow.gif';
                        G.width = 5;
                        G.height = 3;
                };
                F = E.insertCell(-1);
                F.appendChild(this._CreatePaddingElement(B));
        };
        A.appendChild(C);
};
FCKToolbarButtonUI.prototype.ChangeState = function (A, B)
{
        if (!B && this.State == A) return;
        var e = this.MainElement;
        if (!e) return;
        switch (parseInt(A, 10))
        {
        case 0:
                e.className = 'TB_Button_Off';
                break;
        case 1:
                e.className = 'TB_Button_On';
                break;
        case -1:
                e.className = 'TB_Button_Disabled';
                break;
        };
        this.State = A;
};

function FCKToolbarButtonUI_OnMouseOver(A, B)
{
        if (B.State == 0) this.className = 'TB_Button_Off_Over';
        else if (B.State == 1) this.className = 'TB_Button_On_Over';
};

function FCKToolbarButtonUI_OnMouseOut(A, B)
{
        if (B.State == 0) this.className = 'TB_Button_Off';
        else if (B.State == 1) this.className = 'TB_Button_On';
};

function FCKToolbarButtonUI_OnClick(A, B)
{
        if (B.OnClick && B.State != -1) B.OnClick(B);
};

function FCKToolbarButtonUI_Cleanup()
{
        this.MainElement = null;
};
var FCKToolbarButton = function (A, B, C, D, E, F, G)
        {
                this.CommandName = A;
                this.Label = B;
                this.Tooltip = C;
                this.Style = D;
                this.SourceView = E ? true : false;
                this.ContextSensitive = F ? true : false;
                if (G == null) this.IconPath = FCKConfig.SkinPath + 'toolbar/' + A.toLowerCase() + '.gif';
                else if (typeof (G) == 'number') this.IconPath = [FCKConfig.SkinPath + 'fck_strip.gif', 16, G];
                else this.IconPath = G;
        };
FCKToolbarButton.prototype.Create = function (A)
{
        this._UIButton = new FCKToolbarButtonUI(this.CommandName, this.Label, this.Tooltip, this.IconPath, this.Style);
        this._UIButton.OnClick = this.Click;
        this._UIButton._ToolbarButton = this;
        this._UIButton.Create(A);
};
FCKToolbarButton.prototype.RefreshState = function ()
{
        var A = this._UIButton;
        if (!A) return;
        var B = FCK.ToolbarSet.CurrentInstance.Commands.GetCommand(this.CommandName).GetState();
        if (B == A.State) return;
        A.ChangeState(B);
};
FCKToolbarButton.prototype.Click = function ()
{
        var A = this._ToolbarButton || this;
        FCK.ToolbarSet.CurrentInstance.Commands.GetCommand(A.CommandName).Execute();
};
FCKToolbarButton.prototype.Enable = function ()
{
        this.RefreshState();
};
FCKToolbarButton.prototype.Disable = function ()
{
        this._UIButton.ChangeState(-1);
};
var FCKSpecialCombo = function (A, B, C, D, E)
        {
                this.FieldWidth = B || 100;
                this.PanelWidth = C || 150;
                this.PanelMaxHeight = D || 150;
                this.Label = '&nbsp;';
                this.Caption = A;
                this.Tooltip = A;
                this.Style = 2;
                this.Enabled = true;
                this.Items = {};
                this._Panel = new FCKPanel(E || window);
                this._Panel.AppendStyleSheet(FCKConfig.SkinEditorCSS);
                this._PanelBox = this._Panel.MainNode.appendChild(this._Panel.Document.createElement('DIV'));
                this._PanelBox.className = 'SC_Panel';
                this._PanelBox.style.width = this.PanelWidth + 'px';
                this._PanelBox.innerHTML = '<table cellpadding="0" cellspacing="0" width="100%" style="TABLE-LAYOUT: fixed"><tr><td nowrap></td></tr></table>';
                this._ItemsHolderEl = this._PanelBox.getElementsByTagName('TD')[0];
                if (FCK.IECleanup) FCK.IECleanup.AddItem(this, FCKSpecialCombo_Cleanup);
        };

function FCKSpecialCombo_ItemOnMouseOver()
{
        this.className += ' SC_ItemOver';
};

function FCKSpecialCombo_ItemOnMouseOut()
{
        this.className = this.originalClass;
};

function FCKSpecialCombo_ItemOnClick(A, B, C)
{
        this.className = this.originalClass;
        B._Panel.Hide();
        B.SetLabel(this.FCKItemLabel);
        if (typeof (B.OnSelect) == 'function') B.OnSelect(C, this);
};
FCKSpecialCombo.prototype.ClearItems = function ()
{
        if (this.Items) this.Items = {};
        var A = this._ItemsHolderEl;
        while (A.firstChild) A.removeChild(A.firstChild);
};
FCKSpecialCombo.prototype.AddItem = function (A, B, C, D)
{
        var E = this._ItemsHolderEl.appendChild(this._Panel.Document.createElement('DIV'));
        E.className = E.originalClass = 'SC_Item';
        E.innerHTML = B;
        E.FCKItemLabel = C || A;
        E.Selected = false;
        if (FCKBrowserInfo.IsIE) E.style.width = '100%';
        if (D) E.style.backgroundColor = D;
        FCKTools.AddEventListenerEx(E, 'mouseover', FCKSpecialCombo_ItemOnMouseOver);
        FCKTools.AddEventListenerEx(E, 'mouseout', FCKSpecialCombo_ItemOnMouseOut);
        FCKTools.AddEventListenerEx(E, 'click', FCKSpecialCombo_ItemOnClick, [this, A]);
        this.Items[A.toString().toLowerCase()] = E;
        return E;
};
FCKSpecialCombo.prototype.SelectItem = function (A)
{
        if (typeof A == 'string') A = this.Items[A.toString().toLowerCase()];
        if (A)
        {
                A.className = A.originalClass = 'SC_ItemSelected';
                A.Selected = true;
        }
};
FCKSpecialCombo.prototype.SelectItemByLabel = function (A, B)
{
        for (var C in this.Items)
        {
                var D = this.Items[C];
                if (D.FCKItemLabel == A)
                {
                        D.className = D.originalClass = 'SC_ItemSelected';
                        D.Selected = true;
                        if (B) this.SetLabel(A);
                }
        }
};
FCKSpecialCombo.prototype.DeselectAll = function (A)
{
        for (var i in this.Items)
        {
                if (!this.Items[i]) continue;
                this.Items[i].className = this.Items[i].originalClass = 'SC_Item';
                this.Items[i].Selected = false;
        };
        if (A) this.SetLabel('');
};
FCKSpecialCombo.prototype.SetLabelById = function (A)
{
        A = A ? A.toString().toLowerCase() : '';
        var B = this.Items[A];
        this.SetLabel(B ? B.FCKItemLabel : '');
};
FCKSpecialCombo.prototype.SetLabel = function (A)
{
        A = (!A || A.length == 0) ? '&nbsp;' : A;
        if (A == this.Label) return;
        this.Label = A;
        var B = this._LabelEl;
        if (B)
        {
                B.innerHTML = A;
                FCKTools.DisableSelection(B);
        }
};
FCKSpecialCombo.prototype.SetEnabled = function (A)
{
        this.Enabled = A;
        if (this._OuterTable) this._OuterTable.className = A ? '' : 'SC_FieldDisabled';
};
FCKSpecialCombo.prototype.Create = function (A)
{
        var B = FCKTools.GetElementDocument(A);
        var C = this._OuterTable = A.appendChild(B.createElement('TABLE'));
        C.cellPadding = 0;
        C.cellSpacing = 0;
        C.insertRow(-1);
        var D;
        var E;
        switch (this.Style)
        {
        case 0:
                D = 'TB_ButtonType_Icon';
                E = false;
                break;
        case 1:
                D = 'TB_ButtonType_Text';
                E = false;
                break;
        case 2:
                E = true;
                break;
        };
        if (this.Caption && this.Caption.length > 0 && E)
        {
                var F = C.rows[0].insertCell(-1);
                F.innerHTML = this.Caption;
                F.className = 'SC_FieldCaption';
        };
        var G = FCKTools.AppendElement(C.rows[0].insertCell(-1), 'div');
        if (E)
        {
                G.className = 'SC_Field';
                G.style.width = this.FieldWidth + 'px';
                G.innerHTML = '<table width="100%" cellpadding="0" cellspacing="0" style="TABLE-LAYOUT: fixed;"><tbody><tr><td class="SC_FieldLabel"><label>&nbsp;</label></td><td class="SC_FieldButton">&nbsp;</td></tr></tbody></table>';
                this._LabelEl = G.getElementsByTagName('label')[0];
                this._LabelEl.innerHTML = this.Label;
        }
        else
        {
                G.className = 'TB_Button_Off';
                G.innerHTML = '<table title="' + this.Tooltip + '" class="' + D + '" cellspacing="0" cellpadding="0" border="0"><tr><td><img class="TB_Button_Padding" src="' + FCK_SPACER_PATH + '" /></td><td class="TB_Text">' + this.Caption + '</td><td><img class="TB_Button_Padding" src="' + FCK_SPACER_PATH + '" /></td><td class="TB_ButtonArrow"><img src="' + FCKConfig.SkinPath + 'images/toolbar.buttonarrow.gif" width="5" height="3"></td><td><img class="TB_Button_Padding" src="' + FCK_SPACER_PATH + '" /></td></tr></table>';
        };
        FCKTools.AddEventListenerEx(G, 'mouseover', FCKSpecialCombo_OnMouseOver, this);
        FCKTools.AddEventListenerEx(G, 'mouseout', FCKSpecialCombo_OnMouseOut, this);
        FCKTools.AddEventListenerEx(G, 'click', FCKSpecialCombo_OnClick, this);
        FCKTools.DisableSelection(this._Panel.Document.body);
};

function FCKSpecialCombo_Cleanup()
{
        this._LabelEl = null;
        this._OuterTable = null;
        this._ItemsHolderEl = null;
        this._PanelBox = null;
        if (this.Items)
        {
                for (var A in this.Items) this.Items[A] = null;
        }
};

function FCKSpecialCombo_OnMouseOver(A, B)
{
        if (B.Enabled)
        {
                switch (B.Style)
                {
                case 0:
                        this.className = 'TB_Button_On_Over';
                        break;
                case 1:
                        this.className = 'TB_Button_On_Over';
                        break;
                case 2:
                        this.className = 'SC_Field SC_FieldOver';
                        break;
                }
        }
};

function FCKSpecialCombo_OnMouseOut(A, B)
{
        switch (B.Style)
        {
        case 0:
                this.className = 'TB_Button_Off';
                break;
        case 1:
                this.className = 'TB_Button_Off';
                break;
        case 2:
                this.className = 'SC_Field';
                break;
        }
};

function FCKSpecialCombo_OnClick(e, A)
{
        if (A.Enabled)
        {
                var B = A._Panel;
                var C = A._PanelBox;
                var D = A._ItemsHolderEl;
                var E = A.PanelMaxHeight;
                if (A.OnBeforeClick) A.OnBeforeClick(A);
                if (FCKBrowserInfo.IsIE) B.Preload(0, this.offsetHeight, this);
                if (D.offsetHeight > E) C.style.height = E + 'px';
                else C.style.height = '';
                B.Show(0, this.offsetHeight, this);
        }
};
var FCKToolbarSpecialCombo = function ()
        {
                this.SourceView = false;
                this.ContextSensitive = true;
                this.FieldWidth = null;
                this.PanelWidth = null;
                this.PanelMaxHeight = null;
        };
FCKToolbarSpecialCombo.prototype.DefaultLabel = '';

function FCKToolbarSpecialCombo_OnSelect(A, B)
{
        FCK.ToolbarSet.CurrentInstance.Commands.GetCommand(this.CommandName).Execute(A, B);
};
FCKToolbarSpecialCombo.prototype.Create = function (A)
{
        this._Combo = new FCKSpecialCombo(this.GetLabel(), this.FieldWidth, this.PanelWidth, this.PanelMaxHeight, FCKBrowserInfo.IsIE ? window : FCKTools.GetElementWindow(A).parent);
        this._Combo.Tooltip = this.Tooltip;
        this._Combo.Style = this.Style;
        this.CreateItems(this._Combo);
        this._Combo.Create(A);
        this._Combo.CommandName = this.CommandName;
        this._Combo.OnSelect = FCKToolbarSpecialCombo_OnSelect;
};

function FCKToolbarSpecialCombo_RefreshActiveItems(A, B)
{
        A.DeselectAll();
        A.SelectItem(B);
        A.SetLabelById(B);
};
FCKToolbarSpecialCombo.prototype.RefreshState = function ()
{
        var A;
        var B = FCK.ToolbarSet.CurrentInstance.Commands.GetCommand(this.CommandName).GetState();
        if (B != -1)
        {
                A = 1;
                if (this.RefreshActiveItems) this.RefreshActiveItems(this._Combo, B);
                else
                {
                        if (this._LastValue !== B)
                        {
                                this._LastValue = B;
                                if (!B || B.length == 0)
                                {
                                        this._Combo.DeselectAll();
                                        this._Combo.SetLabel(this.DefaultLabel);
                                }
                                else FCKToolbarSpecialCombo_RefreshActiveItems(this._Combo, B);
                        }
                }
        }
        else A = -1;
        if (A == this.State) return;
        if (A == -1)
        {
                this._Combo.DeselectAll();
                this._Combo.SetLabel('');
        };
        this.State = A;
        this._Combo.SetEnabled(A != -1);
};
FCKToolbarSpecialCombo.prototype.Enable = function ()
{
        this.RefreshState();
};
FCKToolbarSpecialCombo.prototype.Disable = function ()
{
        this.State = -1;
        this._Combo.DeselectAll();
        this._Combo.SetLabel('');
        this._Combo.SetEnabled(false);
};
var FCKToolbarStyleCombo = function (A, B)
        {
                if (A === false) return;
                this.CommandName = 'Style';
                this.Label = this.GetLabel();
                this.Tooltip = A ? A : this.Label;
                this.Style = B ? B : 2;
                this.DefaultLabel = FCKConfig.DefaultStyleLabel || '';
        };
FCKToolbarStyleCombo.prototype = new FCKToolbarSpecialCombo;
FCKToolbarStyleCombo.prototype.GetLabel = function ()
{
        return FCKLang.Style;
};
FCKToolbarStyleCombo.prototype.GetStyles = function ()
{
        var A = {};
        var B = FCK.ToolbarSet.CurrentInstance.Styles.GetStyles();
        for (var C in B)
        {
                var D = B[C];
                if (!D.IsCore) A[C] = D;
        };
        return A;
};
FCKToolbarStyleCombo.prototype.CreateItems = function (A)
{
        var B = A._Panel.Document;
        FCKTools.AppendStyleSheet(B, FCKConfig.ToolbarComboPreviewCSS);
        FCKTools.AppendStyleString(B, FCKConfig.EditorAreaStyles);
        B.body.className += ' ForceBaseFont';
        FCKConfig.ApplyBodyAttributes(B.body);
        var C = this.GetStyles();
        for (var D in C)
        {
                var E = C[D];
                var F = E.GetType() == 2 ? D : FCKToolbarStyleCombo_BuildPreview(E, E.Label || D);
                var G = A.AddItem(D, F);
                G.Style = E;
        };
        A.OnBeforeClick = this.StyleCombo_OnBeforeClick;
};
FCKToolbarStyleCombo.prototype.RefreshActiveItems = function (A)
{
        var B = FCK.ToolbarSet.CurrentInstance.Selection.GetBoundaryParentElement(true);
        if (B)
        {
                var C = new FCKElementPath(B);
                var D = C.Elements;
                for (var e = 0; e < D.length; e++)
                {
                        for (var i in A.Items)
                        {
                                var E = A.Items[i];
                                var F = E.Style;
                                if (F.CheckElementRemovable(D[e], true))
                                {
                                        A.SetLabel(F.Label || F.Name);
                                        return;
                                }
                        }
                }
        };
        A.SetLabel(this.DefaultLabel);
};
FCKToolbarStyleCombo.prototype.StyleCombo_OnBeforeClick = function (A)
{
        A.DeselectAll();
        var B;
        var C;
        var D;
        var E = FCK.ToolbarSet.CurrentInstance.Selection;
        if (E.GetType() == 'Control')
        {
                B = E.GetSelectedElement();
                D = B.nodeName.toLowerCase();
        }
        else
        {
                B = E.GetBoundaryParentElement(true);
                C = new FCKElementPath(B);
        };
        for (var i in A.Items)
        {
                var F = A.Items[i];
                var G = F.Style;
                if ((D && G.Element == D) || (!D && G.GetType() != 2))
                {
                        F.style.display = '';
                        if ((C && G.CheckActive(C)) || (!C && G.CheckElementRemovable(B, true))) A.SelectItem(G.Name);
                }
                else F.style.display = 'none';
        }
};

function FCKToolbarStyleCombo_BuildPreview(A, B)
{
        var C = A.GetType();
        var D = [];
        if (C == 0) D.push('<div class="BaseFont">');
        var E = A.Element;
        if (E == 'bdo') E = 'span';
        D = ['<', E];
        var F = A._StyleDesc.Attributes;
        if (F)
        {
                for (var G in F)
                {
                        D.push(' ', G, '="', A.GetFinalAttributeValue(G), '"');
                }
        };
        if (A._GetStyleText().length > 0) D.push(' style="', A.GetFinalStyleValue(), '"');
        D.push('>', B, '</', E, '>');
        if (C == 0) D.push('</div>');
        return D.join('');
};
var FCKToolbarFontFormatCombo = function (A, B)
        {
                if (A === false) return;
                this.CommandName = 'FontFormat';
                this.Label = this.GetLabel();
                this.Tooltip = A ? A : this.Label;
                this.Style = B ? B : 2;
                this.NormalLabel = 'Normal';
                this.PanelWidth = 190;
                this.DefaultLabel = FCKConfig.DefaultFontFormatLabel || '';
        };
FCKToolbarFontFormatCombo.prototype = new FCKToolbarStyleCombo(false);
FCKToolbarFontFormatCombo.prototype.GetLabel = function ()
{
        return FCKLang.FontFormat;
};
FCKToolbarFontFormatCombo.prototype.GetStyles = function ()
{
        var A = {};
        var B = FCKLang['FontFormats'].split(';');
        var C = {
                p: B[0],
                pre: B[1],
                address: B[2],
                h1: B[3],
                h2: B[4],
                h3: B[5],
                h4: B[6],
                h5: B[7],
                h6: B[8],
                div: B[9] || (B[0] + ' (DIV)')
        };
        var D = FCKConfig.FontFormats.split(';');
        for (var i = 0; i < D.length; i++)
        {
                var E = D[i];
                var F = FCKStyles.GetStyle('_FCK_' + E);
                if (F)
                {
                        F.Label = C[E];
                        A['_FCK_' + E] = F;
                }
                else alert("The FCKConfig.CoreStyles['" + E + "'] setting was not found. Please check the fckconfig.js file");
        };
        return A;
};
FCKToolbarFontFormatCombo.prototype.RefreshActiveItems = function (A)
{
        var B = FCK.ToolbarSet.CurrentInstance.Selection.GetBoundaryParentElement(true);
        if (B)
        {
                var C = new FCKElementPath(B);
                var D = C.Block;
                if (D)
                {
                        for (var i in A.Items)
                        {
                                var E = A.Items[i];
                                var F = E.Style;
                                if (F.CheckElementRemovable(D))
                                {
                                        A.SetLabel(F.Label);
                                        return;
                                }
                        }
                }
        };
        A.SetLabel(this.DefaultLabel);
};
FCKToolbarFontFormatCombo.prototype.StyleCombo_OnBeforeClick = function (A)
{
        A.DeselectAll();
        var B = FCK.ToolbarSet.CurrentInstance.Selection.GetBoundaryParentElement(true);
        if (B)
        {
                var C = new FCKElementPath(B);
                var D = C.Block;
                for (var i in A.Items)
                {
                        var E = A.Items[i];
                        var F = E.Style;
                        if (F.CheckElementRemovable(D))
                        {
                                A.SelectItem(E);
                                return;
                        }
                }
        }
};
var FCKToolbarFontsCombo = function (A, B)
        {
                this.CommandName = 'FontName';
                this.Label = this.GetLabel();
                this.Tooltip = A ? A : this.Label;
                this.Style = B ? B : 2;
                this.DefaultLabel = FCKConfig.DefaultFontLabel || '';
        };
FCKToolbarFontsCombo.prototype = new FCKToolbarFontFormatCombo(false);
FCKToolbarFontsCombo.prototype.GetLabel = function ()
{
        return FCKLang.Font;
};
FCKToolbarFontsCombo.prototype.GetStyles = function ()
{
        var A = FCKStyles.GetStyle('_FCK_FontFace');
        if (!A)
        {
                alert("The FCKConfig.CoreStyles['Size'] setting was not found. Please check the fckconfig.js file");
                return {};
        };
        var B = {};
        var C = FCKConfig.FontNames.split(';');
        for (var i = 0; i < C.length; i++)
        {
                var D = C[i].split('/');
                var E = D[0];
                var F = D[1] || E;
                var G = FCKTools.CloneObject(A);
                G.SetVariable('Font', E);
                G.Label = F;
                B[F] = G;
        };
        return B;
};
FCKToolbarFontsCombo.prototype.RefreshActiveItems = FCKToolbarStyleCombo.prototype.RefreshActiveItems;
FCKToolbarFontsCombo.prototype.StyleCombo_OnBeforeClick = function (A)
{
        A.DeselectAll();
        var B = FCKSelection.GetBoundaryParentElement(true);
        if (B)
        {
                var C = new FCKElementPath(B);
                for (var i in A.Items)
                {
                        var D = A.Items[i];
                        var E = D.Style;
                        if (E.CheckActive(C))
                        {
                                A.SelectItem(D);
                                return;
                        }
                }
        }
};
var FCKToolbarFontSizeCombo = function (A, B)
        {
                this.CommandName = 'FontSize';
                this.Label = this.GetLabel();
                this.Tooltip = A ? A : this.Label;
                this.Style = B ? B : 2;
                this.DefaultLabel = FCKConfig.DefaultFontSizeLabel || '';
                this.FieldWidth = 70;
        };
FCKToolbarFontSizeCombo.prototype = new FCKToolbarFontFormatCombo(false);
FCKToolbarFontSizeCombo.prototype.GetLabel = function ()
{
        return FCKLang.FontSize;
};
FCKToolbarFontSizeCombo.prototype.GetStyles = function ()
{
        var A = FCKStyles.GetStyle('_FCK_Size');
        if (!A)
        {
                alert("The FCKConfig.CoreStyles['FontFace'] setting was not found. Please check the fckconfig.js file");
                return {};
        };
        var B = {};
        var C = FCKConfig.FontSizes.split(';');
        for (var i = 0; i < C.length; i++)
        {
                var D = C[i].split('/');
                var E = D[0];
                var F = D[1] || E;
                var G = FCKTools.CloneObject(A);
                G.SetVariable('Size', E);
                G.Label = F;
                B[F] = G;
        };
        return B;
};
FCKToolbarFontSizeCombo.prototype.RefreshActiveItems = FCKToolbarStyleCombo.prototype.RefreshActiveItems;
FCKToolbarFontSizeCombo.prototype.StyleCombo_OnBeforeClick = FCKToolbarFontsCombo.prototype.StyleCombo_OnBeforeClick;
var FCKToolbarPanelButton = function (A, B, C, D, E)
        {
                this.CommandName = A;
                var F;
                if (E == null) F = FCKConfig.SkinPath + 'toolbar/' + A.toLowerCase() + '.gif';
                else if (typeof (E) == 'number') F = [FCKConfig.SkinPath + 'fck_strip.gif', 16, E];
                var G = this._UIButton = new FCKToolbarButtonUI(A, B, C, F, D);
                G._FCKToolbarPanelButton = this;
                G.ShowArrow = true;
                G.OnClick = FCKToolbarPanelButton_OnButtonClick;
        };
FCKToolbarPanelButton.prototype.TypeName = 'FCKToolbarPanelButton';
FCKToolbarPanelButton.prototype.Create = function (A)
{
        A.className += 'Menu';
        this._UIButton.Create(A);
        var B = FCK.ToolbarSet.CurrentInstance.Commands.GetCommand(this.CommandName)._Panel;
        this.RegisterPanel(B);
};
FCKToolbarPanelButton.prototype.RegisterPanel = function (A)
{
        if (A._FCKToolbarPanelButton) return;
        A._FCKToolbarPanelButton = this;
        var B = A.Document.body.appendChild(A.Document.createElement('div'));
        B.style.position = 'absolute';
        B.style.top = '0px';
        var C = A._FCKToolbarPanelButtonLineDiv = B.appendChild(A.Document.createElement('IMG'));
        C.className = 'TB_ConnectionLine';
        C.style.position = 'absolute';
        C.src = FCK_SPACER_PATH;
        A.OnHide = FCKToolbarPanelButton_OnPanelHide;
};

function FCKToolbarPanelButton_OnButtonClick(A)
{
        var B = this._FCKToolbarPanelButton;
        var e = B._UIButton.MainElement;
        B._UIButton.ChangeState(1);
        var C = FCK.ToolbarSet.CurrentInstance.Commands.GetCommand(B.CommandName);
        var D = C._Panel;
        D._FCKToolbarPanelButtonLineDiv.style.width = (e.offsetWidth - 2) + 'px';
        C.Execute(0, e.offsetHeight - 1, e);
};

function FCKToolbarPanelButton_OnPanelHide()
{
        var A = this._FCKToolbarPanelButton;
        A._UIButton.ChangeState(0);
};
FCKToolbarPanelButton.prototype.RefreshState = FCKToolbarButton.prototype.RefreshState;
FCKToolbarPanelButton.prototype.Enable = FCKToolbarButton.prototype.Enable;
FCKToolbarPanelButton.prototype.Disable = FCKToolbarButton.prototype.Disable;
var FCKScayt;
(function ()
{
        var A = [];
        var B = (FCK && FCK.EditorWindow && FCK.EditorWindow.parent.parent.scayt) ? true : false;
        var C = false;
        var D = false;

        function ScaytEngineLoad(callback)
        {
                if (B) return;
                B = true;
                var E = FCK.EditorWindow.parent.parent;
                var F = function ()
                        {
                                window.scayt = E.scayt;
                                InitScayt();
                                var G = FCKToolbarItems.LoadedItems['ScaytCombobox'];
                                G && G.SetEnabled(scyt_control && scyt_control.disabled);
                                InitSetup();
                        };
                if (E.scayt)
                {
                        F();
                        return;
                };
                if (FCK.Config.ScaytCustomUrl) FCK.Config.ScaytCustomUrl = new String(FCK.Config.ScaytCustomUrl).replace(new RegExp("^http[s]*:\/\/"), "");
                var H = document.location.protocol;
                var I = FCK.Config.ScaytCustomUrl || 'svc.spellchecker.net/spellcheck3/lf/scayt/scayt4.js';
                var J = H + '//' + I;
                var K = ParseUrl(J).path + '/';
                var L = E.window.CKEDITOR || (E.window.CKEDITOR = {});
                L._djScaytConfig = {
                        I: K,
                        addOnLoad: function ()
                        {
                                F();
                        },
                        isDebug: false
                };
                if (callback) A.push(callback);
                DoLoadScript(J);
        };

        function DoLoadScript(url)
        {
                if (!url) return false;
                var E = FCK.EditorWindow.parent.parent;
                var s = E.document.createElement('script');
                s.type = 'text/javascript';
                s.src = url;
                E.document.getElementsByTagName('head')[0].appendChild(s);
                return true;
        };

        function ParseUrl(data)
        {
                var m = data.match(/(.*)[\/\\]([^\/\\]+\.\w+)$/);
                return m ? {
                        path: m[1],
                        file: m[2]
                } : data;
        };

        function createScaytControl()
        {
                var N = {};
                var E = FCK.EditorWindow.parent.parent;
                N.srcNodeRef = FCK.EditingArea.IFrame;
                N.customerid = FCK.Config.ScaytCustomerid;
                N.customDictionaryName = FCK.Config.ScaytCustomDictionaryName;
                N.userDictionaryName = FCK.Config.ScaytUserDictionaryName;
                N.defLang = FCK.Config.ScaytDefLang;
                var P = E.scayt;
                var Q = window.scayt_control = new P(N);
        };

        function InitScayt()
        {
                createScaytControl();
                var Q = window.scayt_control;
                if (Q)
                {
                        Q.setDisabled(false);
                        D = true;
                        C = !Q.disabled;
                        var G = FCKToolbarItems.LoadedItems['ScaytCombobox'];
                        G && G.Enable();
                        ShowScaytState();
                };
                for (var i = 0; i < A.length; i++)
                {
                        try
                        {
                                A[i].call(this);
                        }
                        catch (err)
                        {}
                }
        };
        var T = function ()
                {
                        name = 'Scayt';
                };
        T.prototype.Execute = function (c)
        {
                switch (c)
                {
                case 'Options':
                case 'Langs':
                case 'About':
                        if (B && D && !C)
                        {
                                ScaytMessage('SCAYT is not enabled');
                                break;
                        };
                        if (B && D) FCKDialog.OpenDialog('Scayt', 'SCAYT Settings', 'dialog/fck_scayt.html?' + c.toLowerCase(), 343, 343);
                        break;
                default:
                        if (!B)
                        {
                                var U = this;
                                ScaytEngineLoad(function ()
                                {
                                        U.SetEnabled(!window.scayt_control.disabled);
                                });
                                return true;
                        }
                        else if (D)
                        {
                                if (C) this.Disable();
                                else this.Enable();
                                ShowScaytState();
                        }
                };
                if (!B) return ScaytMessage('SCAYT is not loaded') || false;
                if (!D) return ScaytMessage('SCAYT is not ready') || false;
                return true;
        };
        T.prototype.Enable = function ()
        {
                window.scayt_control.setDisabled(false);
                C = true;
        };
        T.prototype.Disable = function ()
        {
                window.scayt_control.setDisabled(true);
                C = false;
        };
        T.prototype.SetEnabled = function (state)
        {
                if (state) this.Enable();
                else this.Disable();
                ShowScaytState();
                return true;
        };
        T.prototype.GetState = function ()
        {
                return 0;
        };

        function ShowScaytState()
        {
                var W = FCKToolbarItems.GetItem('SpellCheck');
                if (!W || !W._Combo || !W._Combo._OuterTable) return;
                var X = W._Combo._OuterTable.getElementsByTagName('img')[1];
                var Y = W._Combo.Items['trigger'];
                if (C)
                {
                        X.style.opacity = '1';
                        Y.innerHTML = GetStatusLabel();
                }
                else
                {
                        X.style.opacity = '0.5';
                        Y.innerHTML = GetStatusLabel();
                }
        };

        function GetStatusLabel()
        {
                if (!D) return '<b>Enable SCAYT</b>';
                return C ? '<b>Disable SCAYT</b>' : '<b>Enable SCAYT</b>';
        };
        var Z = function (tooltip, style)
                {
                        this.Command = FCKCommands.GetCommand('Scayt');
                        this.CommandName = 'Scayt';
                        this.Label = this.GetLabel();
                        this.Tooltip = FCKLang.ScaytTitle;
                        this.Style = 1;
                };
        Z.prototype = new FCKToolbarSpecialCombo;
        Z.prototype.CreateItems = function ()
        {
                this._Combo.AddItem('Trigger', '<b>Enable SCAYT</b>');
                this._Combo.AddItem('Options', FCKLang.ScaytTitleOptions || "Options");
                this._Combo.AddItem('Langs', FCKLang.ScaytTitleLangs || "Languages");
                this._Combo.AddItem('About', FCKLang.ScaytTitleAbout || "About");
        };
        Z.prototype.GetLabel = function ()
        {
                var a = FCKConfig.SkinPath + 'fck_strip.gif';
                return FCKBrowserInfo.IsIE ? '<div class="TB_Button_Image"><img src="' + a + '" style="top:-192px"></div>' : '<img class="TB_Button_Image" src="' + FCK_SPACER_PATH + '" style="background-position: 0px -192px;background-image: url(' + a + ');">';
        };

        function ScaytMessage(m)
        {
                m && alert(m);
        };
        var b = function ()
                {
                        name = 'ScaytContext';
                };
        b.prototype.Execute = function (contextInfo)
        {
                var c = contextInfo && contextInfo.action,
                        g = c && contextInfo.node,
                        Q = window.scayt_control;
                if (g)
                {
                        switch (c)
                        {
                        case 'Suggestion':
                                Q.replace(g, contextInfo.suggestion);
                                break;
                        case 'Ignore':
                                Q.ignore(g);
                                break;
                        case 'Ignore All':
                                Q.ignoreAll(g);
                                break;
                        case 'Add Word':
                                var E = FCK.EditorWindow.parent.parent;
                                E.scayt.addWordToUserDictionary(g);
                                break;
                        }
                }
        };

        function InitSetup()
        {
                FCK.ContextMenu.RegisterListener(
                {
                        AddItems: function (menu)
                        {
                                var E = FCK.EditorWindow.parent.parent;
                                var Q = window.scayt_control,
                                        P = E.scayt;
                                if (!Q) return;
                                var g = Q.getScaytNode();
                                if (!g) return;
                                var h = P.getSuggestion(Q.getWord(g), Q.getLang());
                                if (!h || !h.length) return;
                                menu.AddSeparator();
                                var j = FCK.Config.ScaytMaxSuggestions || 5;
                                var k = (j == -1) ? h.length : j;
                                for (var i = 0; i < k; i += 1)
                                {
                                        if (h[i])
                                        {
                                                menu.AddItem('ScaytContext', h[i], null, false, {
                                                        'action': 'Suggestion',
                                                        'node': g,
                                                        'suggestion': h[i]
                                                });
                                        }
                                };
                                menu.AddSeparator();
                                menu.AddItem('ScaytContext', 'Ignore', null, false, {
                                        'action': 'Ignore',
                                        'node': g
                                });
                                menu.AddItem('ScaytContext', 'Ignore All', null, false, {
                                        'action': 'Ignore All',
                                        'node': g
                                });
                                menu.AddItem('ScaytContext', 'Add Word', null, false, {
                                        'action': 'Add Word',
                                        'node': g
                                });
                                try
                                {
                                        if (D && C) Q.fireOnContextMenu(null, FCK.ContextMenu._InnerContextMenu);
                                }
                                catch (err)
                                {}
                        }
                });
                FCK.Events.AttachEvent('OnPaste', function ()
                {
                        window.scayt_control.refresh();
                        return true;
                });
        };
        FCK.Events.AttachEvent('OnAfterSetHTML', function ()
        {
                if (FCKConfig.SpellChecker == 'SCAYT')
                {
                        if (!B && FCK.Config.ScaytAutoStartup) ScaytEngineLoad();
                        if (FCK.EditMode == 0 && B && D) createScaytControl();
                        ShowScaytState();
                }
        });
        FCK.Events.AttachEvent('OnBeforeGetData', function ()
        {
                D && window.scayt_control.reset();
        });
        FCK.Events.AttachEvent('OnAfterGetData', function ()
        {
                D && window.scayt_control.refresh();
        });
        FCKScayt = {
                CreateCommand: function ()
                {
                        return new T();
                },
                CreateContextCommand: function ()
                {
                        return new b();
                },
                CreateToolbarItem: function ()
                {
                        return new Z();
                }
        };
})();
var FCKToolbarItems = {};
FCKToolbarItems.LoadedItems = {};
FCKToolbarItems.RegisterItem = function (A, B)
{
        this.LoadedItems[A] = B;
};
FCKToolbarItems.GetItem = function (A)
{
        var B = FCKToolbarItems.LoadedItems[A];
        if (B) return B;
        switch (A)
        {
        case 'Source':
                B = new FCKToolbarButton('Source', FCKLang.Source, null, 2, true, true, 1);
                break;
        case 'DocProps':
                B = new FCKToolbarButton('DocProps', FCKLang.DocProps, null, null, null, null, 2);
                break;
        case 'Save':
                B = new FCKToolbarButton('Save', FCKLang.Save, null, null, true, null, 3);
                break;
        case 'NewPage':
                B = new FCKToolbarButton('NewPage', FCKLang.NewPage, null, null, true, null, 4);
                break;
        case 'Preview':
                B = new FCKToolbarButton('Preview', FCKLang.Preview, null, null, true, null, 5);
                break;
        case 'Templates':
                B = new FCKToolbarButton('Templates', FCKLang.Templates, null, null, null, null, 6);
                break;
        case 'About':
                B = new FCKToolbarButton('About', FCKLang.About, null, null, true, null, 47);
                break;
        case 'Cut':
                B = new FCKToolbarButton('Cut', FCKLang.Cut, null, null, false, true, 7);
                break;
        case 'Copy':
                B = new FCKToolbarButton('Copy', FCKLang.Copy, null, null, false, true, 8);
                break;
        case 'Paste':
                B = new FCKToolbarButton('Paste', FCKLang.Paste, null, null, false, true, 9);
                break;
        case 'PasteText':
                B = new FCKToolbarButton('PasteText', FCKLang.PasteText, null, null, false, true, 10);
                break;
        case 'PasteWord':
                B = new FCKToolbarButton('PasteWord', FCKLang.PasteWord, null, null, false, true, 11);
                break;
        case 'Print':
                B = new FCKToolbarButton('Print', FCKLang.Print, null, null, false, true, 12);
                break;
        case 'Undo':
                B = new FCKToolbarButton('Undo', FCKLang.Undo, null, null, false, true, 14);
                break;
        case 'Redo':
                B = new FCKToolbarButton('Redo', FCKLang.Redo, null, null, false, true, 15);
                break;
        case 'SelectAll':
                B = new FCKToolbarButton('SelectAll', FCKLang.SelectAll, null, null, true, null, 18);
                break;
        case 'RemoveFormat':
                B = new FCKToolbarButton('RemoveFormat', FCKLang.RemoveFormat, null, null, false, true, 19);
                break;
        case 'FitWindow':
                B = new FCKToolbarButton('FitWindow', FCKLang.FitWindow, null, null, true, true, 66);
                break;
        case 'Bold':
                B = new FCKToolbarButton('Bold', FCKLang.Bold, null, null, false, true, 20);
                break;
        case 'Italic':
                B = new FCKToolbarButton('Italic', FCKLang.Italic, null, null, false, true, 21);
                break;
        case 'Underline':
                B = new FCKToolbarButton('Underline', FCKLang.Underline, null, null, false, true, 22);
                break;
        case 'StrikeThrough':
                B = new FCKToolbarButton('StrikeThrough', FCKLang.StrikeThrough, null, null, false, true, 23);
                break;
        case 'Subscript':
                B = new FCKToolbarButton('Subscript', FCKLang.Subscript, null, null, false, true, 24);
                break;
        case 'Superscript':
                B = new FCKToolbarButton('Superscript', FCKLang.Superscript, null, null, false, true, 25);
                break;
        case 'OrderedList':
                B = new FCKToolbarButton('InsertOrderedList', FCKLang.NumberedListLbl, FCKLang.NumberedList, null, false, true, 26);
                break;
        case 'UnorderedList':
                B = new FCKToolbarButton('InsertUnorderedList', FCKLang.BulletedListLbl, FCKLang.BulletedList, null, false, true, 27);
                break;
        case 'Outdent':
                B = new FCKToolbarButton('Outdent', FCKLang.DecreaseIndent, null, null, false, true, 28);
                break;
        case 'Indent':
                B = new FCKToolbarButton('Indent', FCKLang.IncreaseIndent, null, null, false, true, 29);
                break;
        case 'Blockquote':
                B = new FCKToolbarButton('Blockquote', FCKLang.Blockquote, null, null, false, true, 73);
                break;
        case 'CreateDiv':
                B = new FCKToolbarButton('CreateDiv', FCKLang.CreateDiv, null, null, false, true, 74);
                break;
        case 'Link':
                B = new FCKToolbarButton('Link', FCKLang.InsertLinkLbl, FCKLang.InsertLink, null, false, true, 34);
                break;
        case 'Unlink':
                B = new FCKToolbarButton('Unlink', FCKLang.RemoveLink, null, null, false, true, 35);
                break;
        case 'Anchor':
                B = new FCKToolbarButton('Anchor', FCKLang.Anchor, null, null, null, null, 36);
                break;
        case 'Image':
                B = new FCKToolbarButton('Image', FCKLang.InsertImageLbl, FCKLang.InsertImage, null, false, true, 37);
                break;
        case 'Flash':
                B = new FCKToolbarButton('Flash', FCKLang.InsertFlashLbl, FCKLang.InsertFlash, null, false, true, 38);
                break;
        case 'Table':
                B = new FCKToolbarButton('Table', FCKLang.InsertTableLbl, FCKLang.InsertTable, null, false, true, 39);
                break;
        case 'SpecialChar':
                B = new FCKToolbarButton('SpecialChar', FCKLang.InsertSpecialCharLbl, FCKLang.InsertSpecialChar, null, false, true, 42);
                break;
        case 'Smiley':
                B = new FCKToolbarButton('Smiley', FCKLang.InsertSmileyLbl, FCKLang.InsertSmiley, null, false, true, 41);
                break;
        case 'PageBreak':
                B = new FCKToolbarButton('PageBreak', FCKLang.PageBreakLbl, FCKLang.PageBreak, null, false, true, 43);
                break;
        case 'Rule':
                B = new FCKToolbarButton('Rule', FCKLang.InsertLineLbl, FCKLang.InsertLine, null, false, true, 40);
                break;
        case 'JustifyLeft':
                B = new FCKToolbarButton('JustifyLeft', FCKLang.LeftJustify, null, null, false, true, 30);
                break;
        case 'JustifyCenter':
                B = new FCKToolbarButton('JustifyCenter', FCKLang.CenterJustify, null, null, false, true, 31);
                break;
        case 'JustifyRight':
                B = new FCKToolbarButton('JustifyRight', FCKLang.RightJustify, null, null, false, true, 32);
                break;
        case 'JustifyFull':
                B = new FCKToolbarButton('JustifyFull', FCKLang.BlockJustify, null, null, false, true, 33);
                break;
        case 'Style':
                B = new FCKToolbarStyleCombo();
                break;
        case 'FontName':
                B = new FCKToolbarFontsCombo();
                break;
        case 'FontSize':
                B = new FCKToolbarFontSizeCombo();
                break;
        case 'FontFormat':
                B = new FCKToolbarFontFormatCombo();
                break;
        case 'TextColor':
                B = new FCKToolbarPanelButton('TextColor', FCKLang.TextColor, null, null, 45);
                break;
        case 'BGColor':
                B = new FCKToolbarPanelButton('BGColor', FCKLang.BGColor, null, null, 46);
                break;
        case 'Find':
                B = new FCKToolbarButton('Find', FCKLang.Find, null, null, null, null, 16);
                break;
        case 'Replace':
                B = new FCKToolbarButton('Replace', FCKLang.Replace, null, null, null, null, 17);
                break;
        case 'Form':
                B = new FCKToolbarButton('Form', FCKLang.Form, null, null, null, null, 48);
                break;
        case 'Checkbox':
                B = new FCKToolbarButton('Checkbox', FCKLang.Checkbox, null, null, null, null, 49);
                break;
        case 'Radio':
                B = new FCKToolbarButton('Radio', FCKLang.RadioButton, null, null, null, null, 50);
                break;
        case 'TextField':
                B = new FCKToolbarButton('TextField', FCKLang.TextField, null, null, null, null, 51);
                break;
        case 'Textarea':
                B = new FCKToolbarButton('Textarea', FCKLang.Textarea, null, null, null, null, 52);
                break;
        case 'HiddenField':
                B = new FCKToolbarButton('HiddenField', FCKLang.HiddenField, null, null, null, null, 56);
                break;
        case 'Button':
                B = new FCKToolbarButton('Button', FCKLang.Button, null, null, null, null, 54);
                break;
        case 'Select':
                B = new FCKToolbarButton('Select', FCKLang.SelectionField, null, null, null, null, 53);
                break;
        case 'ImageButton':
                B = new FCKToolbarButton('ImageButton', FCKLang.ImageButton, null, null, null, null, 55);
                break;
        case 'ShowBlocks':
                B = new FCKToolbarButton('ShowBlocks', FCKLang.ShowBlocks, null, null, null, true, 72);
                break;
        case 'SpellCheck':
                if (FCKConfig.SpellChecker == 'SCAYT') B = FCKScayt.CreateToolbarItem();
                else B = new FCKToolbarButton('SpellCheck', FCKLang.SpellCheck, null, null, null, null, 13);
                break;
        default:
                alert(FCKLang.UnknownToolbarItem.replace(/%1/g, A));
                return null;
        };
        FCKToolbarItems.LoadedItems[A] = B;
        return B;
};
var FCKToolbar = function ()
        {
                this.Items = [];
        };
FCKToolbar.prototype.AddItem = function (A)
{
        return this.Items[this.Items.length] = A;
};
FCKToolbar.prototype.AddButton = function (A, B, C, D, E, F)
{
        if (typeof (D) == 'number') D = [this.DefaultIconsStrip, this.DefaultIconSize, D];
        var G = new FCKToolbarButtonUI(A, B, C, D, E, F);
        G._FCKToolbar = this;
        G.OnClick = FCKToolbar_OnItemClick;
        return this.AddItem(G);
};

function FCKToolbar_OnItemClick(A)
{
        var B = A._FCKToolbar;
        if (B.OnItemClick) B.OnItemClick(B, A);
};
FCKToolbar.prototype.AddSeparator = function ()
{
        this.AddItem(new FCKToolbarSeparator());
};
FCKToolbar.prototype.Create = function (A)
{
        var B = FCKTools.GetElementDocument(A);
        var e = B.createElement('table');
        e.className = 'TB_Toolbar';
        e.style.styleFloat = e.style.cssFloat = (FCKLang.Dir == 'ltr' ? 'left' : 'right');
        e.dir = FCKLang.Dir;
        e.cellPadding = 0;
        e.cellSpacing = 0;
        var C = e.insertRow(-1);
        var D;
        if (!this.HideStart)
        {
                D = C.insertCell(-1);
                D.appendChild(B.createElement('div')).className = 'TB_Start';
        };
        for (var i = 0; i < this.Items.length; i++)
        {
                this.Items[i].Create(C.insertCell(-1));
        };
        if (!this.HideEnd)
        {
                D = C.insertCell(-1);
                D.appendChild(B.createElement('div')).className = 'TB_End';
        };
        A.appendChild(e);
};
var FCKToolbarSeparator = function ()
        {};
FCKToolbarSeparator.prototype.Create = function (A)
{
        FCKTools.AppendElement(A, 'div').className = 'TB_Separator';
};
var FCKToolbarBreak = function ()
        {};
FCKToolbarBreak.prototype.Create = function (A)
{
        var B = FCKTools.GetElementDocument(A).createElement('div');
        B.className = 'TB_Break';
        B.style.clear = FCKLang.Dir == 'rtl' ? 'left' : 'right';
        A.appendChild(B);
};

function FCKToolbarSet_Create(A)
{
        var B;
        var C = A || FCKConfig.ToolbarLocation;
        switch (C)
        {
        case 'In':
                document.getElementById('xToolbarRow').style.display = '';
                B = new FCKToolbarSet(document);
                break;
        case 'None':
                B = new FCKToolbarSet(document);
                break;
        default:
                FCK.Events.AttachEvent('OnBlur', FCK_OnBlur);
                FCK.Events.AttachEvent('OnFocus', FCK_OnFocus);
                var D;
                var E = C.match(/^Out:(.+)\((\w+)\)$/);
                if (E)
                {
                        if (FCKBrowserInfo.IsAIR) FCKAdobeAIR.ToolbarSet_GetOutElement(window, E);
                        else D = eval('parent.' + E[1]).document.getElementById(E[2]);
                }
                else
                {
                        E = C.match(/^Out:(\w+)$/);
                        if (E) D = parent.document.getElementById(E[1]);
                };
                if (!D)
                {
                        alert('Invalid value for "ToolbarLocation"');
                        return arguments.callee('In');
                };
                B = D.__FCKToolbarSet;
                if (B) break;
                var F = FCKTools.GetElementDocument(D).createElement('iframe');
                F.src = 'javascript:void(0)';
                F.frameBorder = 0;
                F.width = '100%';
                F.height = '10';
                D.appendChild(F);
                F.unselectable = 'on';
                var G = F.contentWindow.document;
                var H = '';
                if (FCKBrowserInfo.IsSafari) H = '<base href="' + window.document.location + '">';
                G.open();
                G.write('<html><head>' + H + '<script type="text/javascript"> var adjust = function() { window.frameElement.height = document.body.scrollHeight ; }; window.onresize = window.onload = function(){var timer = null;var lastHeight = -1;var lastChange = 0;var poller = function(){var currentHeight = document.body.scrollHeight || 0;var currentTime = (new Date()).getTime();if (currentHeight != lastHeight){lastChange = currentTime;adjust();lastHeight = document.body.scrollHeight;}if (lastChange < currentTime - 1000) clearInterval(timer);};timer = setInterval(poller, 100);}</script></head><body style="overflow: hidden">' + document.getElementById('xToolbarSpace').innerHTML + '</body></html>');
                G.close();
                if (FCKBrowserInfo.IsAIR) FCKAdobeAIR.ToolbarSet_InitOutFrame(G);
                FCKTools.AddEventListener(G, 'contextmenu', FCKTools.CancelEvent);
                FCKTools.AppendStyleSheet(G, FCKConfig.SkinEditorCSS);
                B = D.__FCKToolbarSet = new FCKToolbarSet(G);
                B._IFrame = F;
                if (FCK.IECleanup) FCK.IECleanup.AddItem(D, FCKToolbarSet_Target_Cleanup);
        };
        B.CurrentInstance = FCK;
        if (!B.ToolbarItems) B.ToolbarItems = FCKToolbarItems;
        FCK.AttachToOnSelectionChange(B.RefreshItemsState);
        return B;
};

function FCK_OnBlur(A)
{
        var B = A.ToolbarSet;
        if (B.CurrentInstance == A) B.Disable();
};

function FCK_OnFocus(A)
{
        var B = A.ToolbarSet;
        var C = A || FCK;
        B.CurrentInstance.FocusManager.RemoveWindow(B._IFrame.contentWindow);
        B.CurrentInstance = C;
        C.FocusManager.AddWindow(B._IFrame.contentWindow, true);
        B.Enable();
};

function FCKToolbarSet_Cleanup()
{
        this._TargetElement = null;
        this._IFrame = null;
};

function FCKToolbarSet_Target_Cleanup()
{
        this.__FCKToolbarSet = null;
};
var FCKToolbarSet = function (A)
        {
                this._Document = A;
                this._TargetElement = A.getElementById('xToolbar');
                var B = A.getElementById('xExpandHandle');
                var C = A.getElementById('xCollapseHandle');
                B.title = FCKLang.ToolbarExpand;
                FCKTools.AddEventListener(B, 'click', FCKToolbarSet_Expand_OnClick);
                C.title = FCKLang.ToolbarCollapse;
                FCKTools.AddEventListener(C, 'click', FCKToolbarSet_Collapse_OnClick);
                if (!FCKConfig.ToolbarCanCollapse || FCKConfig.ToolbarStartExpanded) this.Expand();
                else this.Collapse();
                C.style.display = FCKConfig.ToolbarCanCollapse ? '' : 'none';
                if (FCKConfig.ToolbarCanCollapse) C.style.display = '';
                else A.getElementById('xTBLeftBorder').style.display = '';
                this.Toolbars = [];
                this.IsLoaded = false;
                if (FCK.IECleanup) FCK.IECleanup.AddItem(this, FCKToolbarSet_Cleanup);
        };

function FCKToolbarSet_Expand_OnClick()
{
        FCK.ToolbarSet.Expand();
};

function FCKToolbarSet_Collapse_OnClick()
{
        FCK.ToolbarSet.Collapse();
};
FCKToolbarSet.prototype.Expand = function ()
{
        this._ChangeVisibility(false);
};
FCKToolbarSet.prototype.Collapse = function ()
{
        this._ChangeVisibility(true);
};
FCKToolbarSet.prototype._ChangeVisibility = function (A)
{
        this._Document.getElementById('xCollapsed').style.display = A ? '' : 'none';
        this._Document.getElementById('xExpanded').style.display = A ? 'none' : '';
        if (window.onresize)
        {
                FCKTools.RunFunction(window.onresize);
        }
};
FCKToolbarSet.prototype.Load = function (A)
{
        this.Name = A;
        this.Items = [];
        this.ItemsWysiwygOnly = [];
        this.ItemsContextSensitive = [];
        this._TargetElement.innerHTML = '';
        var B = FCKConfig.ToolbarSets[A];
        if (!B)
        {
                alert(FCKLang.UnknownToolbarSet.replace(/%1/g, A));
                return;
        };
        this.Toolbars = [];
        for (var x = 0; x < B.length; x++)
        {
                var C = B[x];
                if (!C) continue;
                var D;
                if (typeof (C) == 'string')
                {
                        if (C == '/') D = new FCKToolbarBreak();
                }
                else
                {
                        D = new FCKToolbar();
                        for (var j = 0; j < C.length; j++)
                        {
                                var E = C[j];
                                if (E == '-') D.AddSeparator();
                                else
                                {
                                        var F = FCKToolbarItems.GetItem(E);
                                        if (F)
                                        {
                                                D.AddItem(F);
                                                this.Items.push(F);
                                                if (!F.SourceView) this.ItemsWysiwygOnly.push(F);
                                                if (F.ContextSensitive) this.ItemsContextSensitive.push(F);
                                        }
                                }
                        }
                };
                D.Create(this._TargetElement);
                this.Toolbars[this.Toolbars.length] = D;
        };
        FCKTools.DisableSelection(this._Document.getElementById('xCollapseHandle').parentNode);
        if (FCK.Status != 2) FCK.Events.AttachEvent('OnStatusChange', this.RefreshModeState);
        else this.RefreshModeState();
        this.IsLoaded = true;
        this.IsEnabled = true;
        FCKTools.RunFunction(this.OnLoad);
};
FCKToolbarSet.prototype.Enable = function ()
{
        if (this.IsEnabled) return;
        this.IsEnabled = true;
        var A = this.Items;
        for (var i = 0; i < A.length; i++) A[i].RefreshState();
};
FCKToolbarSet.prototype.Disable = function ()
{
        if (!this.IsEnabled) return;
        this.IsEnabled = false;
        var A = this.Items;
        for (var i = 0; i < A.length; i++) A[i].Disable();
};
FCKToolbarSet.prototype.RefreshModeState = function (A)
{
        if (FCK.Status != 2) return;
        var B = A ? A.ToolbarSet : this;
        var C = B.ItemsWysiwygOnly;
        if (FCK.EditMode == 0)
        {
                for (var i = 0; i < C.length; i++) C[i].Enable();
                B.RefreshItemsState(A);
        }
        else
        {
                B.RefreshItemsState(A);
                for (var j = 0; j < C.length; j++) C[j].Disable();
        }
};
FCKToolbarSet.prototype.RefreshItemsState = function (A)
{
        var B = (A ? A.ToolbarSet : this).ItemsContextSensitive;
        for (var i = 0; i < B.length; i++) B[i].RefreshState();
};
var FCKDialog = (function ()
{
        var A;
        var B;
        var C;
        var D = window.parent;
        while (D.parent && D.parent != D)
        {
                try
                {
                        if (D.parent.document.domain != document.domain) break;
                        if (D.parent.document.getElementsByTagName('frameset').length > 0) break;
                }
                catch (e)
                {
                        break;
                };
                D = D.parent;
        };
        var E = D.document;
        var F = function ()
                {
                        if (!B) B = FCKConfig.FloatingPanelsZIndex + 999;
                        return ++B;
                };
        var G = function ()
                {
                        if (!C) return;
                        var H = FCKTools.IsStrictMode(E) ? E.documentElement : E.body;
                        FCKDomTools.SetElementStyles(C, {
                                'width': Math.max(H.scrollWidth, H.clientWidth, E.scrollWidth || 0) - 1 + 'px',
                                'height': Math.max(H.scrollHeight, H.clientHeight, E.scrollHeight || 0) - 1 + 'px'
                        });
                };
        return {
                OpenDialog: function (dialogName, dialogTitle, dialogPage, width, height, customValue, resizable)
                {
                        if (!A) this.DisplayMainCover();
                        var I = {
                                Title: dialogTitle,
                                Page: dialogPage,
                                Editor: window,
                                CustomValue: customValue,
                                TopWindow: D
                        };
                        FCK.ToolbarSet.CurrentInstance.Selection.Save(true);
                        var J = FCKTools.GetViewPaneSize(D);
                        var K = {
                                'X': 0,
                                'Y': 0
                        };
                        var L = FCKBrowserInfo.IsIE && (!FCKBrowserInfo.IsIE7 || !FCKTools.IsStrictMode(D.document));
                        if (L) K = FCKTools.GetScrollPosition(D);
                        var M = Math.max(K.Y + (J.Height - height - 20) / 2, 0);
                        var N = Math.max(K.X + (J.Width - width - 20) / 2, 0);
                        var O = E.createElement('iframe');
                        FCKTools.ResetStyles(O);
                        O.src = FCKConfig.BasePath + 'fckdialog.html';
                        O.frameBorder = 0;
                        O.allowTransparency = true;
                        FCKDomTools.SetElementStyles(O, {
                                'position': (L) ? 'absolute' : 'fixed',
                                'top': M + 'px',
                                'left': N + 'px',
                                'width': width + 'px',
                                'height': height + 'px',
                                'zIndex': F()
                        });
                        O._DialogArguments = I;
                        E.body.appendChild(O);
                        O._ParentDialog = A;
                        A = O;
                },
                OnDialogClose: function (dialogWindow)
                {
                        var O = dialogWindow.frameElement;
                        FCKDomTools.RemoveNode(O);
                        if (O._ParentDialog)
                        {
                                A = O._ParentDialog;
                                O._ParentDialog.contentWindow.SetEnabled(true);
                        }
                        else
                        {
                                if (!FCKBrowserInfo.IsIE) FCK.Focus();
                                this.HideMainCover();
                                setTimeout(function ()
                                {
                                        A = null;
                                }, 0);
                                FCK.ToolbarSet.CurrentInstance.Selection.Release();
                        }
                },
                DisplayMainCover: function ()
                {
                        C = E.createElement('div');
                        FCKTools.ResetStyles(C);
                        FCKDomTools.SetElementStyles(C, {
                                'position': 'absolute',
                                'zIndex': F(),
                                'top': '0px',
                                'left': '0px',
                                'backgroundColor': FCKConfig.BackgroundBlockerColor
                        });
                        FCKDomTools.SetOpacity(C, FCKConfig.BackgroundBlockerOpacity);
                        if (FCKBrowserInfo.IsIE && !FCKBrowserInfo.IsIE7)
                        {
                                var Q = E.createElement('iframe');
                                FCKTools.ResetStyles(Q);
                                Q.hideFocus = true;
                                Q.frameBorder = 0;
                                Q.src = FCKTools.GetVoidUrl();
                                FCKDomTools.SetElementStyles(Q, {
                                        'width': '100%',
                                        'height': '100%',
                                        'position': 'absolute',
                                        'left': '0px',
                                        'top': '0px',
                                        'filter': 'progid:DXImageTransform.Microsoft.Alpha(opacity=0)'
                                });
                                C.appendChild(Q);
                        };
                        FCKTools.AddEventListener(D, 'resize', G);
                        G();
                        E.body.appendChild(C);
                        FCKFocusManager.Lock();
                        var R = FCK.ToolbarSet.CurrentInstance.GetInstanceObject('frameElement');
                        R._fck_originalTabIndex = R.tabIndex;
                        R.tabIndex = -1;
                },
                HideMainCover: function ()
                {
                        FCKDomTools.RemoveNode(C);
                        FCKFocusManager.Unlock();
                        var R = FCK.ToolbarSet.CurrentInstance.GetInstanceObject('frameElement');
                        R.tabIndex = R._fck_originalTabIndex;
                        FCKDomTools.ClearElementJSProperty(R, '_fck_originalTabIndex');
                },
                GetCover: function ()
                {
                        return C;
                }
        };
})();
var FCKMenuItem = function (A, B, C, D, E, F)
        {
                this.Name = B;
                this.Label = C || B;
                this.IsDisabled = E;
                this.Icon = new FCKIcon(D);
                this.SubMenu = new FCKMenuBlockPanel();
                this.SubMenu.Parent = A;
                this.SubMenu.OnClick = FCKTools.CreateEventListener(FCKMenuItem_SubMenu_OnClick, this);
                this.CustomData = F;
                if (FCK.IECleanup) FCK.IECleanup.AddItem(this, FCKMenuItem_Cleanup);
        };
FCKMenuItem.prototype.AddItem = function (A, B, C, D, E)
{
        this.HasSubMenu = true;
        return this.SubMenu.AddItem(A, B, C, D, E);
};
FCKMenuItem.prototype.AddSeparator = function ()
{
        this.SubMenu.AddSeparator();
};
FCKMenuItem.prototype.Create = function (A)
{
        var B = this.HasSubMenu;
        var C = FCKTools.GetElementDocument(A);
        var r = this.MainElement = A.insertRow(-1);
        r.className = this.IsDisabled ? 'MN_Item_Disabled' : 'MN_Item';
        if (!this.IsDisabled)
        {
                FCKTools.AddEventListenerEx(r, 'mouseover', FCKMenuItem_OnMouseOver, [this]);
                FCKTools.AddEventListenerEx(r, 'click', FCKMenuItem_OnClick, [this]);
                if (!B) FCKTools.AddEventListenerEx(r, 'mouseout', FCKMenuItem_OnMouseOut, [this]);
        };
        var D = r.insertCell(-1);
        D.className = 'MN_Icon';
        D.appendChild(this.Icon.CreateIconElement(C));
        D = r.insertCell(-1);
        D.className = 'MN_Label';
        D.noWrap = true;
        D.appendChild(C.createTextNode(this.Label));
        D = r.insertCell(-1);
        if (B)
        {
                D.className = 'MN_Arrow';
                var E = D.appendChild(C.createElement('IMG'));
                E.src = FCK_IMAGES_PATH + 'arrow_' + FCKLang.Dir + '.gif';
                E.width = 4;
                E.height = 7;
                this.SubMenu.Create();
                this.SubMenu.Panel.OnHide = FCKTools.CreateEventListener(FCKMenuItem_SubMenu_OnHide, this);
        }
};
FCKMenuItem.prototype.Activate = function ()
{
        this.MainElement.className = 'MN_Item_Over';
        if (this.HasSubMenu)
        {
                this.SubMenu.Show(this.MainElement.offsetWidth + 2, -2, this.MainElement);
        };
        FCKTools.RunFunction(this.OnActivate, this);
};
FCKMenuItem.prototype.Deactivate = function ()
{
        this.MainElement.className = 'MN_Item';
        if (this.HasSubMenu) this.SubMenu.Hide();
};

function FCKMenuItem_SubMenu_OnClick(A, B)
{
        FCKTools.RunFunction(B.OnClick, B, [A]);
};

function FCKMenuItem_SubMenu_OnHide(A)
{
        A.Deactivate();
};

function FCKMenuItem_OnClick(A, B)
{
        if (B.HasSubMenu) B.Activate();
        else
        {
                B.Deactivate();
                FCKTools.RunFunction(B.OnClick, B, [B]);
        }
};

function FCKMenuItem_OnMouseOver(A, B)
{
        B.Activate();
};

function FCKMenuItem_OnMouseOut(A, B)
{
        B.Deactivate();
};

function FCKMenuItem_Cleanup()
{
        this.MainElement = null;
};
var FCKMenuBlock = function ()
        {
                this._Items = [];
        };
FCKMenuBlock.prototype.Count = function ()
{
        return this._Items.length;
};
FCKMenuBlock.prototype.AddItem = function (A, B, C, D, E)
{
        var F = new FCKMenuItem(this, A, B, C, D, E);
        F.OnClick = FCKTools.CreateEventListener(FCKMenuBlock_Item_OnClick, this);
        F.OnActivate = FCKTools.CreateEventListener(FCKMenuBlock_Item_OnActivate, this);
        this._Items.push(F);
        return F;
};
FCKMenuBlock.prototype.AddSeparator = function ()
{
        this._Items.push(new FCKMenuSeparator());
};
FCKMenuBlock.prototype.RemoveAllItems = function ()
{
        this._Items = [];
        var A = this._ItemsTable;
        if (A)
        {
                while (A.rows.length > 0) A.deleteRow(0);
        }
};
FCKMenuBlock.prototype.Create = function (A)
{
        if (!this._ItemsTable)
        {
                if (FCK.IECleanup) FCK.IECleanup.AddItem(this, FCKMenuBlock_Cleanup);
                this._Window = FCKTools.GetElementWindow(A);
                var B = FCKTools.GetElementDocument(A);
                var C = A.appendChild(B.createElement('table'));
                C.cellPadding = 0;
                C.cellSpacing = 0;
                FCKTools.DisableSelection(C);
                var D = C.insertRow(-1).insertCell(-1);
                D.className = 'MN_Menu';
                var E = this._ItemsTable = D.appendChild(B.createElement('table'));
                E.cellPadding = 0;
                E.cellSpacing = 0;
        };
        for (var i = 0; i < this._Items.length; i++) this._Items[i].Create(this._ItemsTable);
};

function FCKMenuBlock_Item_OnClick(A, B)
{
        if (B.Hide) B.Hide();
        FCKTools.RunFunction(B.OnClick, B, [A]);
};

function FCKMenuBlock_Item_OnActivate(A)
{
        var B = A._ActiveItem;
        if (B && B != this)
        {
                if (!FCKBrowserInfo.IsIE && B.HasSubMenu && !this.HasSubMenu)
                {
                        A._Window.focus();
                        A.Panel.HasFocus = true;
                };
                B.Deactivate();
        };
        A._ActiveItem = this;
};

function FCKMenuBlock_Cleanup()
{
        this._Window = null;
        this._ItemsTable = null;
};
var FCKMenuSeparator = function ()
        {};
FCKMenuSeparator.prototype.Create = function (A)
{
        var B = FCKTools.GetElementDocument(A);
        var r = A.insertRow(-1);
        var C = r.insertCell(-1);
        C.className = 'MN_Separator MN_Icon';
        C = r.insertCell(-1);
        C.className = 'MN_Separator';
        C.appendChild(B.createElement('DIV')).className = 'MN_Separator_Line';
        C = r.insertCell(-1);
        C.className = 'MN_Separator';
        C.appendChild(B.createElement('DIV')).className = 'MN_Separator_Line';
};
var FCKMenuBlockPanel = function ()
        {
                FCKMenuBlock.call(this);
        };
FCKMenuBlockPanel.prototype = new FCKMenuBlock();
FCKMenuBlockPanel.prototype.Create = function ()
{
        var A = this.Panel = (this.Parent && this.Parent.Panel ? this.Parent.Panel.CreateChildPanel() : new FCKPanel());
        A.AppendStyleSheet(FCKConfig.SkinEditorCSS);
        FCKMenuBlock.prototype.Create.call(this, A.MainNode);
};
FCKMenuBlockPanel.prototype.Show = function (x, y, A)
{
        if (!this.Panel.CheckIsOpened()) this.Panel.Show(x, y, A);
};
FCKMenuBlockPanel.prototype.Hide = function ()
{
        if (this.Panel.CheckIsOpened()) this.Panel.Hide();
};
var FCKContextMenu = function (A, B)
        {
                this.CtrlDisable = false;
                var C = this._Panel = new FCKPanel(A);
                C.AppendStyleSheet(FCKConfig.SkinEditorCSS);
                C.IsContextMenu = true;
                if (FCKBrowserInfo.IsGecko) C.Document.addEventListener('draggesture', function (e)
                {
                        e.preventDefault();
                        return false;
                }, true);
                var D = this._MenuBlock = new FCKMenuBlock();
                D.Panel = C;
                D.OnClick = FCKTools.CreateEventListener(FCKContextMenu_MenuBlock_OnClick, this);
                this._Redraw = true;
        };
FCKContextMenu.prototype.SetMouseClickWindow = function (A)
{
        if (!FCKBrowserInfo.IsIE)
        {
                this._Document = A.document;
                if (FCKBrowserInfo.IsOpera && !('oncontextmenu' in document.createElement('foo')))
                {
                        this._Document.addEventListener('mousedown', FCKContextMenu_Document_OnMouseDown, false);
                        this._Document.addEventListener('mouseup', FCKContextMenu_Document_OnMouseUp, false);
                };
                this._Document.addEventListener('contextmenu', FCKContextMenu_Document_OnContextMenu, false);
        }
};
FCKContextMenu.prototype.AddItem = function (A, B, C, D, E)
{
        var F = this._MenuBlock.AddItem(A, B, C, D, E);
        this._Redraw = true;
        return F;
};
FCKContextMenu.prototype.AddSeparator = function ()
{
        this._MenuBlock.AddSeparator();
        this._Redraw = true;
};
FCKContextMenu.prototype.RemoveAllItems = function ()
{
        this._MenuBlock.RemoveAllItems();
        this._Redraw = true;
};
FCKContextMenu.prototype.AttachToElement = function (A)
{
        if (FCKBrowserInfo.IsIE) FCKTools.AddEventListenerEx(A, 'contextmenu', FCKContextMenu_AttachedElement_OnContextMenu, this);
        else A._FCKContextMenu = this;
};

function FCKContextMenu_Document_OnContextMenu(e)
{
        if (FCKConfig.BrowserContextMenu) return true;
        var A = e.target;
        while (A)
        {
                if (A._FCKContextMenu)
                {
                        if (A._FCKContextMenu.CtrlDisable && (e.ctrlKey || e.metaKey)) return true;
                        FCKTools.CancelEvent(e);
                        FCKContextMenu_AttachedElement_OnContextMenu(e, A._FCKContextMenu, A);
                        return false;
                };
                A = A.parentNode;
        };
        return true;
};
var FCKContextMenu_OverrideButton;

function FCKContextMenu_Document_OnMouseDown(e)
{
        if (!e || e.button != 2) return false;
        if (FCKConfig.BrowserContextMenu) return true;
        var A = e.target;
        while (A)
        {
                if (A._FCKContextMenu)
                {
                        if (A._FCKContextMenu.CtrlDisable && (e.ctrlKey || e.metaKey)) return true;
                        var B = FCKContextMenu_OverrideButton;
                        if (!B)
                        {
                                var C = FCKTools.GetElementDocument(e.target);
                                B = FCKContextMenu_OverrideButton = C.createElement('input');
                                B.type = 'button';
                                var D = C.createElement('p');
                                C.body.appendChild(D);
                                D.appendChild(B);
                        };
                        B.style.cssText = 'position:absolute;top:' + (e.clientY - 2) + 'px;left:' + (e.clientX - 2) + 'px;width:5px;height:5px;opacity:0.01';
                };
                A = A.parentNode;
        };
        return false;
};

function FCKContextMenu_Document_OnMouseUp(e)
{
        if (FCKConfig.BrowserContextMenu) return true;
        var A = FCKContextMenu_OverrideButton;
        if (A)
        {
                var B = A.parentNode;
                B.parentNode.removeChild(B);
                FCKContextMenu_OverrideButton = undefined;
                if (e && e.button == 2)
                {
                        FCKContextMenu_Document_OnContextMenu(e);
                        return false;
                }
        };
        return true;
};

function FCKContextMenu_AttachedElement_OnContextMenu(A, B, C)
{
        if ((B.CtrlDisable && (A.ctrlKey || A.metaKey)) || FCKConfig.BrowserContextMenu) return true;
        var D = C || this;
        if (B.OnBeforeOpen) B.OnBeforeOpen.call(B, D);
        if (B._MenuBlock.Count() == 0) return false;
        if (B._Redraw)
        {
                B._MenuBlock.Create(B._Panel.MainNode);
                B._Redraw = false;
        };
        FCKTools.DisableSelection(B._Panel.Document.body);
        var x = 0;
        var y = 0;
        if (FCKBrowserInfo.IsIE)
        {
                x = A.screenX;
                y = A.screenY;
        }
        else if (FCKBrowserInfo.IsSafari)
        {
                x = A.clientX;
                y = A.clientY;
        }
        else
        {
                x = A.pageX;
                y = A.pageY;
        };
        B._Panel.Show(x, y, A.currentTarget || null);
        return false;
};

function FCKContextMenu_MenuBlock_OnClick(A, B)
{
        B._Panel.Hide();
        FCKTools.RunFunction(B.OnItemClick, B, A);
};
FCK.ContextMenu = {};
FCK.ContextMenu.Listeners = [];
FCK.ContextMenu.RegisterListener = function (A)
{
        if (A) this.Listeners.push(A);
};

function FCK_ContextMenu_Init()
{
        var A = FCK.ContextMenu._InnerContextMenu = new FCKContextMenu(FCKBrowserInfo.IsIE ? window : window.parent, FCKLang.Dir);
        A.CtrlDisable = FCKConfig.BrowserContextMenuOnCtrl;
        A.OnBeforeOpen = FCK_ContextMenu_OnBeforeOpen;
        A.OnItemClick = FCK_ContextMenu_OnItemClick;
        var B = FCK.ContextMenu;
        for (var i = 0; i < FCKConfig.ContextMenu.length; i++) B.RegisterListener(FCK_ContextMenu_GetListener(FCKConfig.ContextMenu[i]));
};

function FCK_ContextMenu_GetListener(A)
{
        switch (A)
        {
        case 'Generic':
                return {
                        AddItems: function (menu, tag, tagName)
                        {
                                menu.AddItem('Cut', FCKLang.Cut, 7, FCKCommands.GetCommand('Cut').GetState() == -1);
                                menu.AddItem('Copy', FCKLang.Copy, 8, FCKCommands.GetCommand('Copy').GetState() == -1);
                                menu.AddItem('Paste', FCKLang.Paste, 9, FCKCommands.GetCommand('Paste').GetState() == -1);
                        }
                };
        case 'Table':
                return {
                        AddItems: function (menu, tag, tagName)
                        {
                                var B = (tagName == 'TABLE');
                                var C = (!B && FCKSelection.HasAncestorNode('TABLE'));
                                if (C)
                                {
                                        menu.AddSeparator();
                                        var D = menu.AddItem('Cell', FCKLang.CellCM);
                                        D.AddItem('TableInsertCellBefore', FCKLang.InsertCellBefore, 69);
                                        D.AddItem('TableInsertCellAfter', FCKLang.InsertCellAfter, 58);
                                        D.AddItem('TableDeleteCells', FCKLang.DeleteCells, 59);
                                        if (FCKBrowserInfo.IsGecko) D.AddItem('TableMergeCells', FCKLang.MergeCells, 60, FCKCommands.GetCommand('TableMergeCells').GetState() == -1);
                                        else
                                        {
                                                D.AddItem('TableMergeRight', FCKLang.MergeRight, 60, FCKCommands.GetCommand('TableMergeRight').GetState() == -1);
                                                D.AddItem('TableMergeDown', FCKLang.MergeDown, 60, FCKCommands.GetCommand('TableMergeDown').GetState() == -1);
                                        };
                                        D.AddItem('TableHorizontalSplitCell', FCKLang.HorizontalSplitCell, 61, FCKCommands.GetCommand('TableHorizontalSplitCell').GetState() == -1);
                                        D.AddItem('TableVerticalSplitCell', FCKLang.VerticalSplitCell, 61, FCKCommands.GetCommand('TableVerticalSplitCell').GetState() == -1);
                                        D.AddSeparator();
                                        D.AddItem('TableCellProp', FCKLang.CellProperties, 57, FCKCommands.GetCommand('TableCellProp').GetState() == -1);
                                        menu.AddSeparator();
                                        D = menu.AddItem('Row', FCKLang.RowCM);
                                        D.AddItem('TableInsertRowBefore', FCKLang.InsertRowBefore, 70);
                                        D.AddItem('TableInsertRowAfter', FCKLang.InsertRowAfter, 62);
                                        D.AddItem('TableDeleteRows', FCKLang.DeleteRows, 63);
                                        menu.AddSeparator();
                                        D = menu.AddItem('Column', FCKLang.ColumnCM);
                                        D.AddItem('TableInsertColumnBefore', FCKLang.InsertColumnBefore, 71);
                                        D.AddItem('TableInsertColumnAfter', FCKLang.InsertColumnAfter, 64);
                                        D.AddItem('TableDeleteColumns', FCKLang.DeleteColumns, 65);
                                };
                                if (B || C)
                                {
                                        menu.AddSeparator();
                                        menu.AddItem('TableDelete', FCKLang.TableDelete);
                                        menu.AddItem('TableProp', FCKLang.TableProperties, 39);
                                }
                        }
                };
        case 'Link':
                return {
                        AddItems: function (menu, tag, tagName)
                        {
                                var E = (tagName == 'A' || FCKSelection.HasAncestorNode('A'));
                                if (E || FCK.GetNamedCommandState('Unlink') != -1)
                                {
                                        var F = FCKSelection.MoveToAncestorNode('A');
                                        var G = (F && F.name.length > 0 && F.href.length == 0);
                                        if (G) return;
                                        menu.AddSeparator();
                                        menu.AddItem('VisitLink', FCKLang.VisitLink);
                                        menu.AddSeparator();
                                        if (E) menu.AddItem('Link', FCKLang.EditLink, 34);
                                        menu.AddItem('Unlink', FCKLang.RemoveLink, 35);
                                }
                        }
                };
        case 'Image':
                return {
                        AddItems: function (menu, tag, tagName)
                        {
                                if (tagName == 'IMG' && !tag.getAttribute('_fckfakelement'))
                                {
                                        menu.AddSeparator();
                                        menu.AddItem('Image', FCKLang.ImageProperties, 37);
                                }
                        }
                };
        case 'Anchor':
                return {
                        AddItems: function (menu, tag, tagName)
                        {
                                var F = FCKSelection.MoveToAncestorNode('A');
                                var G = (F && F.name.length > 0);
                                if (G || (tagName == 'IMG' && tag.getAttribute('_fckanchor')))
                                {
                                        menu.AddSeparator();
                                        menu.AddItem('Anchor', FCKLang.AnchorProp, 36);
                                        menu.AddItem('AnchorDelete', FCKLang.AnchorDelete);
                                }
                        }
                };
        case 'Flash':
                return {
                        AddItems: function (menu, tag, tagName)
                        {
                                if (tagName == 'IMG' && tag.getAttribute('_fckflash'))
                                {
                                        menu.AddSeparator();
                                        menu.AddItem('Flash', FCKLang.FlashProperties, 38);
                                }
                        }
                };
        case 'Form':
                return {
                        AddItems: function (menu, tag, tagName)
                        {
                                if (FCKSelection.HasAncestorNode('FORM'))
                                {
                                        menu.AddSeparator();
                                        menu.AddItem('Form', FCKLang.FormProp, 48);
                                }
                        }
                };
        case 'Checkbox':
                return {
                        AddItems: function (menu, tag, tagName)
                        {
                                if (tagName == 'INPUT' && tag.type == 'checkbox')
                                {
                                        menu.AddSeparator();
                                        menu.AddItem('Checkbox', FCKLang.CheckboxProp, 49);
                                }
                        }
                };
        case 'Radio':
                return {
                        AddItems: function (menu, tag, tagName)
                        {
                                if (tagName == 'INPUT' && tag.type == 'radio')
                                {
                                        menu.AddSeparator();
                                        menu.AddItem('Radio', FCKLang.RadioButtonProp, 50);
                                }
                        }
                };
        case 'TextField':
                return {
                        AddItems: function (menu, tag, tagName)
                        {
                                if (tagName == 'INPUT' && (tag.type == 'text' || tag.type == 'password'))
                                {
                                        menu.AddSeparator();
                                        menu.AddItem('TextField', FCKLang.TextFieldProp, 51);
                                }
                        }
                };
        case 'HiddenField':
                return {
                        AddItems: function (menu, tag, tagName)
                        {
                                if (tagName == 'IMG' && tag.getAttribute('_fckinputhidden'))
                                {
                                        menu.AddSeparator();
                                        menu.AddItem('HiddenField', FCKLang.HiddenFieldProp, 56);
                                }
                        }
                };
        case 'ImageButton':
                return {
                        AddItems: function (menu, tag, tagName)
                        {
                                if (tagName == 'INPUT' && tag.type == 'image')
                                {
                                        menu.AddSeparator();
                                        menu.AddItem('ImageButton', FCKLang.ImageButtonProp, 55);
                                }
                        }
                };
        case 'Button':
                return {
                        AddItems: function (menu, tag, tagName)
                        {
                                if (tagName == 'INPUT' && (tag.type == 'button' || tag.type == 'submit' || tag.type == 'reset'))
                                {
                                        menu.AddSeparator();
                                        menu.AddItem('Button', FCKLang.ButtonProp, 54);
                                }
                        }
                };
        case 'Select':
                return {
                        AddItems: function (menu, tag, tagName)
                        {
                                if (tagName == 'SELECT')
                                {
                                        menu.AddSeparator();
                                        menu.AddItem('Select', FCKLang.SelectionFieldProp, 53);
                                }
                        }
                };
        case 'Textarea':
                return {
                        AddItems: function (menu, tag, tagName)
                        {
                                if (tagName == 'TEXTAREA')
                                {
                                        menu.AddSeparator();
                                        menu.AddItem('Textarea', FCKLang.TextareaProp, 52);
                                }
                        }
                };
        case 'BulletedList':
                return {
                        AddItems: function (menu, tag, tagName)
                        {
                                if (FCKSelection.HasAncestorNode('UL'))
                                {
                                        menu.AddSeparator();
                                        menu.AddItem('BulletedList', FCKLang.BulletedListProp, 27);
                                }
                        }
                };
        case 'NumberedList':
                return {
                        AddItems: function (menu, tag, tagName)
                        {
                                if (FCKSelection.HasAncestorNode('OL'))
                                {
                                        menu.AddSeparator();
                                        menu.AddItem('NumberedList', FCKLang.NumberedListProp, 26);
                                }
                        }
                };
        case 'DivContainer':
                return {
                        AddItems: function (menu, tag, tagName)
                        {
                                var J = FCKDomTools.GetSelectedDivContainers();
                                if (J.length > 0)
                                {
                                        menu.AddSeparator();
                                        menu.AddItem('EditDiv', FCKLang.EditDiv, 75);
                                        menu.AddItem('DeleteDiv', FCKLang.DeleteDiv, 76);
                                }
                        }
                };
        };
        return null;
};

function FCK_ContextMenu_OnBeforeOpen()
{
        FCK.Events.FireEvent('OnSelectionChange');
        var A, sTagName;
        if ((A = FCKSelection.GetSelectedElement())) sTagName = A.tagName;
        var B = FCK.ContextMenu._InnerContextMenu;
        B.RemoveAllItems();
        var C = FCK.ContextMenu.Listeners;
        for (var i = 0; i < C.length; i++) C[i].AddItems(B, A, sTagName);
};

function FCK_ContextMenu_OnItemClick(A)
{
        if (!FCKBrowserInfo.IsIE) FCK.Focus();
        FCKCommands.GetCommand(A.Name).Execute(A.CustomData);
};
var FCKHtmlIterator = function (A)
        {
                this._sourceHtml = A;
        };
FCKHtmlIterator.prototype = {
        Next: function ()
        {
                var A = this._sourceHtml;
                if (A == null) return null;
                var B = FCKRegexLib.HtmlTag.exec(A);
                var C = false;
                var D = "";
                if (B)
                {
                        if (B.index > 0)
                        {
                                D = A.substr(0, B.index);
                                this._sourceHtml = A.substr(B.index);
                        }
                        else
                        {
                                C = true;
                                D = B[0];
                                this._sourceHtml = A.substr(B[0].length);
                        }
                }
                else
                {
                        D = A;
                        this._sourceHtml = null;
                };
                return {
                        'isTag': C,
                        'value': D
                };
        },
        Each: function (A)
        {
                var B;
                while ((B = this.Next())) A(B.isTag, B.value);
        }
};
var FCKHtmlIterator = function (A)
        {
                this._sourceHtml = A;
        };
FCKHtmlIterator.prototype = {
        Next: function ()
        {
                var A = this._sourceHtml;
                if (A == null) return null;
                var B = FCKRegexLib.HtmlTag.exec(A);
                var C = false;
                var D = "";
                if (B)
                {
                        if (B.index > 0)
                        {
                                D = A.substr(0, B.index);
                                this._sourceHtml = A.substr(B.index);
                        }
                        else
                        {
                                C = true;
                                D = B[0];
                                this._sourceHtml = A.substr(B[0].length);
                        }
                }
                else
                {
                        D = A;
                        this._sourceHtml = null;
                };
                return {
                        'isTag': C,
                        'value': D
                };
        },
        Each: function (A)
        {
                var B;
                while ((B = this.Next())) A(B.isTag, B.value);
        }
};
var FCKPlugin = function (A, B, C)
        {
                this.Name = A;
                this.BasePath = C ? C : FCKConfig.PluginsPath;
                this.Path = this.BasePath + A + '/';
                if (!B || B.length == 0) this.AvailableLangs = [];
                else this.AvailableLangs = B.split(',');
        };
FCKPlugin.prototype.Load = function ()
{
        if (this.AvailableLangs.length > 0)
        {
                var A;
                if (this.AvailableLangs.IndexOf(FCKLanguageManager.ActiveLanguage.Code) >= 0) A = FCKLanguageManager.ActiveLanguage.Code;
                else A = this.AvailableLangs[0];
                LoadScript(this.Path + 'lang/' + A + '.js');
        };
        LoadScript(this.Path + 'fckplugin.js');
};
var FCKPlugins = FCK.Plugins = {};
FCKPlugins.ItemsCount = 0;
FCKPlugins.Items = {};
FCKPlugins.Load = function ()
{
        var A = FCKPlugins.Items;
        for (var i = 0; i < FCKConfig.Plugins.Items.length; i++)
        {
                var B = FCKConfig.Plugins.Items[i];
                var C = A[B[0]] = new FCKPlugin(B[0], B[1], B[2]);
                FCKPlugins.ItemsCount++;
        };
        for (var s in A) A[s].Load();
        FCKPlugins.Load = null;
};